@knocklabs/client 0.21.0 → 0.21.2
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/CHANGELOG.md +14 -0
- package/dist/cjs/api.js +1 -1
- package/dist/cjs/api.js.map +1 -1
- package/dist/cjs/clients/feed/feed.js +1 -1
- package/dist/cjs/clients/feed/feed.js.map +1 -1
- package/dist/cjs/clients/feed/utils.js.map +1 -1
- package/dist/cjs/clients/guide/client.js +1 -1
- package/dist/cjs/clients/guide/client.js.map +1 -1
- package/dist/cjs/clients/guide/helpers.js +1 -1
- package/dist/cjs/clients/guide/helpers.js.map +1 -1
- package/dist/cjs/clients/guide/types.js +2 -0
- package/dist/cjs/clients/guide/types.js.map +1 -0
- package/dist/cjs/helpers.js +1 -1
- package/dist/cjs/helpers.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/knock.js +2 -2
- package/dist/cjs/knock.js.map +1 -1
- package/dist/cjs/pageVisibility.js +2 -0
- package/dist/cjs/pageVisibility.js.map +1 -0
- package/dist/esm/api.mjs +27 -12
- package/dist/esm/api.mjs.map +1 -1
- package/dist/esm/clients/feed/feed.mjs +60 -87
- package/dist/esm/clients/feed/feed.mjs.map +1 -1
- package/dist/esm/clients/feed/utils.mjs.map +1 -1
- package/dist/esm/clients/guide/client.mjs +270 -204
- package/dist/esm/clients/guide/client.mjs.map +1 -1
- package/dist/esm/clients/guide/helpers.mjs +34 -44
- package/dist/esm/clients/guide/helpers.mjs.map +1 -1
- package/dist/esm/clients/guide/types.mjs +13 -0
- package/dist/esm/clients/guide/types.mjs.map +1 -0
- package/dist/esm/helpers.mjs +19 -4
- package/dist/esm/helpers.mjs.map +1 -1
- package/dist/esm/index.mjs +13 -10
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/knock.mjs +31 -29
- package/dist/esm/knock.mjs.map +1 -1
- package/dist/esm/pageVisibility.mjs +31 -0
- package/dist/esm/pageVisibility.mjs.map +1 -0
- package/dist/types/api.d.ts +4 -0
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/clients/feed/feed.d.ts +1 -11
- package/dist/types/clients/feed/feed.d.ts.map +1 -1
- package/dist/types/clients/feed/interfaces.d.ts +15 -5
- package/dist/types/clients/feed/interfaces.d.ts.map +1 -1
- package/dist/types/clients/feed/utils.d.ts +0 -2
- package/dist/types/clients/feed/utils.d.ts.map +1 -1
- package/dist/types/clients/guide/client.d.ts +6 -1
- package/dist/types/clients/guide/client.d.ts.map +1 -1
- package/dist/types/clients/guide/helpers.d.ts +1 -7
- package/dist/types/clients/guide/helpers.d.ts.map +1 -1
- package/dist/types/clients/guide/index.d.ts +3 -2
- package/dist/types/clients/guide/index.d.ts.map +1 -1
- package/dist/types/clients/guide/types.d.ts +33 -1
- package/dist/types/clients/guide/types.d.ts.map +1 -1
- package/dist/types/helpers.d.ts +19 -0
- package/dist/types/helpers.d.ts.map +1 -1
- package/dist/types/interfaces.d.ts +2 -0
- package/dist/types/interfaces.d.ts.map +1 -1
- package/dist/types/knock.d.ts +1 -0
- package/dist/types/knock.d.ts.map +1 -1
- package/dist/types/pageVisibility.d.ts +22 -0
- package/dist/types/pageVisibility.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/api.ts +30 -0
- package/src/clients/feed/feed.ts +0 -73
- package/src/clients/feed/interfaces.ts +15 -11
- package/src/clients/feed/utils.ts +11 -2
- package/src/clients/guide/client.ts +206 -84
- package/src/clients/guide/helpers.ts +0 -12
- package/src/clients/guide/index.ts +10 -1
- package/src/clients/guide/types.ts +55 -1
- package/src/helpers.ts +39 -0
- package/src/interfaces.ts +2 -0
- package/src/knock.ts +4 -3
- package/src/pageVisibility.ts +70 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,KAAK,MAAM,SAAS,CAAC;AAE5B,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC;AAE/B,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"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"}
|
package/dist/types/knock.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knock.d.ts","sourceRoot":"","sources":["../../src/knock.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,OAAO,CAAC;AAC9B,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAChD,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,0BAA0B,EAE3B,MAAM,cAAc,CAAC;AAItB,cAAM,KAAK;
|
|
1
|
+
{"version":3,"file":"knock.d.ts","sourceRoot":"","sources":["../../src/knock.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,OAAO,CAAC;AAC9B,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAChD,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,0BAA0B,EAE3B,MAAM,cAAc,CAAC;AAItB,cAAM,KAAK;IAkBP,QAAQ,CAAC,MAAM,EAAE,MAAM;IAjBlB,IAAI,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,SAAS,CAA0B;IACpC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC3B,SAAgB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAU;IAClD,OAAO,CAAC,oBAAoB,CAA8C;IAC1E,QAAQ,CAAC,KAAK,aAAwB;IACtC,QAAQ,CAAC,OAAO,eAA0B;IAC1C,QAAQ,CAAC,WAAW,cAAyB;IAC7C,QAAQ,CAAC,KAAK,cAAyB;IACvC,QAAQ,CAAC,OAAO,gBAA2B;IAC3C,QAAQ,CAAC,IAAI,aAAwB;IACrC,QAAQ,CAAC,QAAQ,gBAA2B;gBAGjC,MAAM,EAAE,MAAM,EACvB,OAAO,GAAE,YAAiB;IAiB5B,MAAM;IASN;;;;;;;OAOG;IACH,YAAY,CACV,0BAA0B,EAAE,MAAM,EAClC,SAAS,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAC9B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,KAAK;IACR,YAAY,CACV,0BAA0B,EAAE,0BAA0B,EACtD,SAAS,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAC9B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,IAAI;IAwEP,sBAAsB;IAUtB,eAAe,CAAC,cAAc,UAAQ;IAKtC,QAAQ;IAOR,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,UAAQ;IAMlC;;OAEG;IACH,OAAO,CAAC,eAAe;YAUT,gCAAgC;IA+B9C;;;;;OAKG;IACH,OAAO,CAAC,SAAS;CAclB;AAED,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Socket } from 'phoenix';
|
|
2
|
+
/**
|
|
3
|
+
* Disconnects the socket after a delay when the page becomes hidden,
|
|
4
|
+
* and reconnects when it becomes visible again. This avoids holding
|
|
5
|
+
* open connections for background tabs that aren't being viewed.
|
|
6
|
+
*
|
|
7
|
+
* The delay prevents unnecessary disconnects during brief tab switches.
|
|
8
|
+
* Phoenix channels automatically rejoin after reconnecting.
|
|
9
|
+
*/
|
|
10
|
+
export declare class PageVisibilityManager {
|
|
11
|
+
private socket;
|
|
12
|
+
private disconnectDelayMs;
|
|
13
|
+
private disconnectTimer;
|
|
14
|
+
private wasConnected;
|
|
15
|
+
constructor(socket: Socket, disconnectDelayMs?: number);
|
|
16
|
+
private onVisibilityChange;
|
|
17
|
+
private scheduleDisconnect;
|
|
18
|
+
private reconnect;
|
|
19
|
+
private clearTimer;
|
|
20
|
+
teardown(): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=pageVisibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageVisibility.d.ts","sourceRoot":"","sources":["../../src/pageVisibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAItC;;;;;;;GAOG;AACH,qBAAa,qBAAqB;IAK9B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,iBAAiB;IAL3B,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,YAAY,CAAS;gBAGnB,MAAM,EAAE,MAAM,EACd,iBAAiB,GAAE,MAAoC;IAOjE,OAAO,CAAC,kBAAkB,CAMxB;IAEF,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,UAAU;IAOlB,QAAQ;CAOT"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@knocklabs/client",
|
|
3
|
-
"version": "0.21.
|
|
3
|
+
"version": "0.21.2",
|
|
4
4
|
"description": "The clientside library for interacting with Knock",
|
|
5
5
|
"homepage": "https://github.com/knocklabs/javascript/tree/main/packages/client",
|
|
6
6
|
"author": "@knocklabs",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"rollup": "^4.46.2",
|
|
66
66
|
"typescript": "^5.8.3",
|
|
67
67
|
"vite": "^5.4.19",
|
|
68
|
-
"vitest": "^3.
|
|
68
|
+
"vitest": "^3.2.4"
|
|
69
69
|
},
|
|
70
70
|
"dependencies": {
|
|
71
71
|
"@babel/runtime": "^7.28.6",
|
package/src/api.ts
CHANGED
|
@@ -2,11 +2,16 @@ import axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from "axios";
|
|
|
2
2
|
import axiosRetry from "axios-retry";
|
|
3
3
|
import { Socket } from "phoenix";
|
|
4
4
|
|
|
5
|
+
import { exponentialBackoffFullJitter } from "./helpers";
|
|
6
|
+
import { PageVisibilityManager } from "./pageVisibility";
|
|
7
|
+
|
|
5
8
|
type ApiClientOptions = {
|
|
6
9
|
host: string;
|
|
7
10
|
apiKey: string;
|
|
8
11
|
userToken: string | undefined;
|
|
9
12
|
branch?: string;
|
|
13
|
+
/** Automatically disconnect the socket when the page is hidden and reconnect when visible. Defaults to `true`. */
|
|
14
|
+
disconnectOnPageHidden?: boolean;
|
|
10
15
|
};
|
|
11
16
|
|
|
12
17
|
export interface ApiResponse {
|
|
@@ -26,6 +31,7 @@ class ApiClient {
|
|
|
26
31
|
private axiosClient: AxiosInstance;
|
|
27
32
|
|
|
28
33
|
public socket: Socket | undefined;
|
|
34
|
+
private pageVisibility: PageVisibilityManager | undefined;
|
|
29
35
|
|
|
30
36
|
constructor(options: ApiClientOptions) {
|
|
31
37
|
this.host = options.host;
|
|
@@ -53,7 +59,23 @@ class ApiClient {
|
|
|
53
59
|
api_key: this.apiKey,
|
|
54
60
|
branch_slug: this.branch,
|
|
55
61
|
},
|
|
62
|
+
reconnectAfterMs: (tries: number) => {
|
|
63
|
+
return exponentialBackoffFullJitter(tries, {
|
|
64
|
+
baseDelayMs: 1000,
|
|
65
|
+
maxDelayMs: 30_000,
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
rejoinAfterMs: (tries: number) => {
|
|
69
|
+
return exponentialBackoffFullJitter(tries, {
|
|
70
|
+
baseDelayMs: 1000,
|
|
71
|
+
maxDelayMs: 60_000,
|
|
72
|
+
});
|
|
73
|
+
},
|
|
56
74
|
});
|
|
75
|
+
|
|
76
|
+
if (options.disconnectOnPageHidden !== false) {
|
|
77
|
+
this.pageVisibility = new PageVisibilityManager(this.socket);
|
|
78
|
+
}
|
|
57
79
|
}
|
|
58
80
|
|
|
59
81
|
axiosRetry(this.axiosClient, {
|
|
@@ -87,6 +109,14 @@ class ApiClient {
|
|
|
87
109
|
}
|
|
88
110
|
}
|
|
89
111
|
|
|
112
|
+
teardown() {
|
|
113
|
+
this.pageVisibility?.teardown();
|
|
114
|
+
|
|
115
|
+
if (this.socket?.isConnected()) {
|
|
116
|
+
this.socket.disconnect();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
90
120
|
private canRetryRequest(error: AxiosError) {
|
|
91
121
|
// Retry Network Errors.
|
|
92
122
|
if (axiosRetry.isNetworkError(error)) {
|
package/src/clients/feed/feed.ts
CHANGED
|
@@ -41,8 +41,6 @@ const feedClientDefaults: Pick<FeedClientOptions, "archived" | "mode"> = {
|
|
|
41
41
|
mode: "compact",
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
const DEFAULT_DISCONNECT_DELAY = 2000;
|
|
45
|
-
|
|
46
44
|
const CLIENT_REF_ID_PREFIX = "client_";
|
|
47
45
|
|
|
48
46
|
class Feed {
|
|
@@ -53,10 +51,7 @@ class Feed {
|
|
|
53
51
|
private userFeedId: string;
|
|
54
52
|
private broadcaster: EventEmitter;
|
|
55
53
|
private broadcastChannel!: BroadcastChannel | null;
|
|
56
|
-
private disconnectTimer: ReturnType<typeof setTimeout> | null = null;
|
|
57
54
|
private hasSubscribedToRealTimeUpdates: boolean = false;
|
|
58
|
-
private visibilityChangeHandler: () => void = () => {};
|
|
59
|
-
private visibilityChangeListenerConnected: boolean = false;
|
|
60
55
|
|
|
61
56
|
// The raw store instance, used for binding in React and other environments
|
|
62
57
|
public store: FeedStore;
|
|
@@ -117,13 +112,6 @@ class Feed {
|
|
|
117
112
|
|
|
118
113
|
this.socketManager?.leave(this);
|
|
119
114
|
|
|
120
|
-
this.tearDownVisibilityListeners();
|
|
121
|
-
|
|
122
|
-
if (this.disconnectTimer) {
|
|
123
|
-
clearTimeout(this.disconnectTimer);
|
|
124
|
-
this.disconnectTimer = null;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
115
|
if (this.broadcastChannel) {
|
|
128
116
|
this.broadcastChannel.close();
|
|
129
117
|
}
|
|
@@ -553,8 +541,6 @@ class Feed {
|
|
|
553
541
|
__loadingType: undefined,
|
|
554
542
|
__fetchSource: undefined,
|
|
555
543
|
__experimentalCrossBrowserUpdates: undefined,
|
|
556
|
-
auto_manage_socket_connection: undefined,
|
|
557
|
-
auto_manage_socket_connection_delay: undefined,
|
|
558
544
|
};
|
|
559
545
|
|
|
560
546
|
const result = await this.knock.client().makeRequest({
|
|
@@ -815,10 +801,6 @@ class Feed {
|
|
|
815
801
|
// In server environments we might not have a socket connection
|
|
816
802
|
if (!this.socketManager) return;
|
|
817
803
|
|
|
818
|
-
if (this.defaultOptions.auto_manage_socket_connection) {
|
|
819
|
-
this.setUpVisibilityListeners();
|
|
820
|
-
}
|
|
821
|
-
|
|
822
804
|
// If we're initializing but they have previously opted to listen to real-time updates
|
|
823
805
|
// then we will automatically reconnect on their behalf
|
|
824
806
|
if (this.hasSubscribedToRealTimeUpdates && this.knock.isAuthenticated()) {
|
|
@@ -838,33 +820,6 @@ class Feed {
|
|
|
838
820
|
}
|
|
839
821
|
}
|
|
840
822
|
|
|
841
|
-
/**
|
|
842
|
-
* Listen for changes to document visibility and automatically disconnect
|
|
843
|
-
* or reconnect the socket after a delay
|
|
844
|
-
*/
|
|
845
|
-
private setUpVisibilityListeners() {
|
|
846
|
-
if (
|
|
847
|
-
typeof document === "undefined" ||
|
|
848
|
-
this.visibilityChangeListenerConnected
|
|
849
|
-
) {
|
|
850
|
-
return;
|
|
851
|
-
}
|
|
852
|
-
|
|
853
|
-
this.visibilityChangeHandler = this.handleVisibilityChange.bind(this);
|
|
854
|
-
this.visibilityChangeListenerConnected = true;
|
|
855
|
-
document.addEventListener("visibilitychange", this.visibilityChangeHandler);
|
|
856
|
-
}
|
|
857
|
-
|
|
858
|
-
private tearDownVisibilityListeners() {
|
|
859
|
-
if (typeof document === "undefined") return;
|
|
860
|
-
|
|
861
|
-
document.removeEventListener(
|
|
862
|
-
"visibilitychange",
|
|
863
|
-
this.visibilityChangeHandler,
|
|
864
|
-
);
|
|
865
|
-
this.visibilityChangeListenerConnected = false;
|
|
866
|
-
}
|
|
867
|
-
|
|
868
823
|
private emitEvent(
|
|
869
824
|
type:
|
|
870
825
|
| MessageEngagementStatus
|
|
@@ -882,34 +837,6 @@ class Feed {
|
|
|
882
837
|
// Internal events only need `items:`
|
|
883
838
|
this.broadcastOverChannel(`items:${type}`, { items });
|
|
884
839
|
}
|
|
885
|
-
|
|
886
|
-
private handleVisibilityChange() {
|
|
887
|
-
const disconnectDelay =
|
|
888
|
-
this.defaultOptions.auto_manage_socket_connection_delay ??
|
|
889
|
-
DEFAULT_DISCONNECT_DELAY;
|
|
890
|
-
|
|
891
|
-
const client = this.knock.client();
|
|
892
|
-
|
|
893
|
-
if (document.visibilityState === "hidden") {
|
|
894
|
-
// When the tab is hidden, clean up the socket connection after a delay
|
|
895
|
-
this.disconnectTimer = setTimeout(() => {
|
|
896
|
-
client.socket?.disconnect();
|
|
897
|
-
this.disconnectTimer = null;
|
|
898
|
-
}, disconnectDelay);
|
|
899
|
-
} else if (document.visibilityState === "visible") {
|
|
900
|
-
// When the tab is visible, clear the disconnect timer if active to cancel disconnecting
|
|
901
|
-
// This handles cases where the tab is only briefly hidden to avoid unnecessary disconnects
|
|
902
|
-
if (this.disconnectTimer) {
|
|
903
|
-
clearTimeout(this.disconnectTimer);
|
|
904
|
-
this.disconnectTimer = null;
|
|
905
|
-
}
|
|
906
|
-
|
|
907
|
-
// If the socket is not connected, try to reconnect
|
|
908
|
-
if (!client.socket?.isConnected()) {
|
|
909
|
-
client.socket?.connect();
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
}
|
|
913
840
|
}
|
|
914
841
|
|
|
915
842
|
export default Feed;
|
|
@@ -34,11 +34,6 @@ export interface FeedClientOptions {
|
|
|
34
34
|
trigger_data?: TriggerData;
|
|
35
35
|
// Optionally enable cross browser feed updates for this feed
|
|
36
36
|
__experimentalCrossBrowserUpdates?: boolean;
|
|
37
|
-
// Optionally automatically manage socket connections on changes to tab visibility (defaults to `false`)
|
|
38
|
-
auto_manage_socket_connection?: boolean;
|
|
39
|
-
// Optionally set the delay amount in milliseconds when automatically disconnecting sockets from inactive tabs (defaults to `2000`)
|
|
40
|
-
// Requires `auto_manage_socket_connection` to be `true`
|
|
41
|
-
auto_manage_socket_connection_delay?: number;
|
|
42
37
|
// Optionally scope notifications to a given date range
|
|
43
38
|
inserted_at_date_range?: {
|
|
44
39
|
// Optionally set the start date with a string in ISO 8601 format
|
|
@@ -65,20 +60,29 @@ export type FetchFeedOptions = {
|
|
|
65
60
|
__fetchSource?: "socket" | "http";
|
|
66
61
|
} & Omit<FeedClientOptions, "__experimentalCrossBrowserUpdates">;
|
|
67
62
|
|
|
68
|
-
|
|
69
|
-
|
|
63
|
+
/**
|
|
64
|
+
* The final data shape that is sent to the the list feed items endpoint of the Knock API.
|
|
65
|
+
*
|
|
66
|
+
* @see https://docs.knock.app/api-reference/users/feeds/list_items
|
|
67
|
+
*/
|
|
70
68
|
export type FetchFeedOptionsForRequest = Omit<
|
|
71
69
|
FeedClientOptions,
|
|
72
|
-
"trigger_data"
|
|
70
|
+
"trigger_data" | "inserted_at_date_range"
|
|
73
71
|
> & {
|
|
74
|
-
|
|
72
|
+
/** The trigger data of the feed items (as a JSON string). */
|
|
75
73
|
trigger_data?: string;
|
|
74
|
+
/** Limits the results to items inserted after or on the given date. */
|
|
75
|
+
"inserted_at.gte"?: string;
|
|
76
|
+
/** Limits the results to items inserted before or on the given date. */
|
|
77
|
+
"inserted_at.lte"?: string;
|
|
78
|
+
/** Limits the results to items inserted after the given date. */
|
|
79
|
+
"inserted_at.gt"?: string;
|
|
80
|
+
/** Limits the results to items inserted before the given date. */
|
|
81
|
+
"inserted_at.lt"?: string;
|
|
76
82
|
// Unset options that should not be sent to the API
|
|
77
83
|
__loadingType: undefined;
|
|
78
84
|
__fetchSource: undefined;
|
|
79
85
|
__experimentalCrossBrowserUpdates: undefined;
|
|
80
|
-
auto_manage_socket_connection: undefined;
|
|
81
|
-
auto_manage_socket_connection_delay: undefined;
|
|
82
86
|
};
|
|
83
87
|
|
|
84
88
|
export interface ContentBlockBase {
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
FeedClientOptions,
|
|
3
|
+
FeedItem,
|
|
4
|
+
FetchFeedOptionsForRequest,
|
|
5
|
+
} from "./interfaces";
|
|
2
6
|
|
|
3
7
|
export function deduplicateItems(items: FeedItem[]): FeedItem[] {
|
|
4
8
|
const seen: Record<string, boolean> = {};
|
|
@@ -22,6 +26,11 @@ export function sortItems(items: FeedItem[]) {
|
|
|
22
26
|
});
|
|
23
27
|
}
|
|
24
28
|
|
|
29
|
+
type DateRangeParams = Pick<
|
|
30
|
+
FetchFeedOptionsForRequest,
|
|
31
|
+
"inserted_at.gte" | "inserted_at.lte" | "inserted_at.gt" | "inserted_at.lt"
|
|
32
|
+
>;
|
|
33
|
+
|
|
25
34
|
export function mergeDateRangeParams(options: FeedClientOptions) {
|
|
26
35
|
const { inserted_at_date_range, ...rest } = options;
|
|
27
36
|
|
|
@@ -29,7 +38,7 @@ export function mergeDateRangeParams(options: FeedClientOptions) {
|
|
|
29
38
|
return rest;
|
|
30
39
|
}
|
|
31
40
|
|
|
32
|
-
const dateRangeParams:
|
|
41
|
+
const dateRangeParams: DateRangeParams = {};
|
|
33
42
|
|
|
34
43
|
// Determine which operators to use based on the inclusive flag
|
|
35
44
|
const isInclusive = inserted_at_date_range.inclusive ?? false;
|