@knocklabs/client 0.5.2 → 0.5.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.
- package/README.md +13 -3
- package/dist/cjs/api.js +0 -1
- package/dist/cjs/api.js.map +1 -1
- package/dist/cjs/clients/feed/feed.js +30 -14
- package/dist/cjs/clients/feed/feed.js.map +1 -1
- package/dist/cjs/clients/feed/interfaces.js +4 -0
- package/dist/cjs/clients/feed/store.js +2 -2
- package/dist/cjs/clients/feed/store.js.map +1 -1
- package/dist/cjs/clients/feed/types.js +4 -0
- package/dist/cjs/clients/preferences/interfaces.js +4 -0
- package/dist/cjs/index.js +4 -4
- package/dist/cjs/interfaces.js +4 -0
- package/dist/cjs/networkStatus.js +1 -1
- package/dist/esm/api.js +1 -2
- package/dist/esm/api.js.map +1 -1
- package/dist/esm/clients/feed/feed.js +27 -9
- package/dist/esm/clients/feed/feed.js.map +1 -1
- package/dist/esm/clients/feed/interfaces.js +1 -1
- package/dist/esm/clients/feed/store.js +2 -2
- package/dist/esm/clients/feed/store.js.map +1 -1
- package/dist/esm/clients/feed/types.js +1 -1
- package/dist/esm/clients/preferences/interfaces.js +1 -1
- package/dist/esm/interfaces.js +1 -1
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/clients/feed/feed.d.ts +4 -11
- package/dist/types/clients/feed/feed.d.ts.map +1 -1
- package/dist/types/clients/feed/interfaces.d.ts +4 -2
- package/dist/types/clients/feed/interfaces.d.ts.map +1 -1
- package/dist/types/clients/feed/store.d.ts.map +1 -1
- package/dist/types/clients/feed/types.d.ts +9 -0
- package/dist/types/clients/feed/types.d.ts.map +1 -1
- package/dist/types/clients/feed/utils.d.ts +1 -1
- package/dist/types/clients/feed/utils.d.ts.map +1 -1
- package/dist/types/clients/preferences/interfaces.d.ts +2 -3
- package/dist/types/clients/preferences/interfaces.d.ts.map +1 -1
- package/dist/types/interfaces.d.ts +9 -2
- package/dist/types/interfaces.d.ts.map +1 -1
- package/package.json +14 -12
package/README.md
CHANGED
|
@@ -67,9 +67,19 @@ const feedClient = knockClient.feeds.initialize(
|
|
|
67
67
|
// Connect to the real-time socket
|
|
68
68
|
const teardown = feedClient.listenForUpdates();
|
|
69
69
|
|
|
70
|
-
// Setup a callback for when a batch of
|
|
71
|
-
feedClient.on("
|
|
72
|
-
console.log(
|
|
70
|
+
// Setup a callback for when a batch of items is received (including on first load and subsequent page load)
|
|
71
|
+
feedClient.on("items.received.page", ({ items }) => {
|
|
72
|
+
console.log(items);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Setup a callback for when new items arrive in real-time
|
|
76
|
+
feedClient.on("items.received.realtime", ({ items }) => {
|
|
77
|
+
console.log(items);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Listen to all received items
|
|
81
|
+
feedClient.on("items.received.*", ({ items }) => {
|
|
82
|
+
console.log(items);
|
|
73
83
|
});
|
|
74
84
|
|
|
75
85
|
// Fetch the feed items
|
package/dist/cjs/api.js
CHANGED
package/dist/cjs/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/api.ts"],"names":["ApiClient","options","host","apiKey","userToken","axiosClient","axios","create","baseURL","headers","Accept","Authorization","socket","Socket","replace","params","user_token","api_key","retries","retryCondition","canRetryRequest","retryDelay","axiosRetry","exponentialDelay","socketConnected","connect","onOpen","disconnect","name","channel","req","result","statusCode","status","body","data","error","undefined","console","isNetworkError","response"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;
|
|
1
|
+
{"version":3,"sources":["../../src/api.ts"],"names":["ApiClient","options","host","apiKey","userToken","axiosClient","axios","create","baseURL","headers","Accept","Authorization","socket","Socket","replace","params","user_token","api_key","retries","retryCondition","canRetryRequest","retryDelay","axiosRetry","exponentialDelay","socketConnected","connect","onOpen","disconnect","name","channel","req","result","statusCode","status","body","data","error","undefined","console","isNetworkError","response"],"mappings":"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","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig } from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport { Socket } from \"phoenix\";\nimport { AxiosError } from \"axios\";\n\ntype ApiClientOptions = {\n host: string;\n apiKey: string;\n userToken: string | undefined;\n};\n\nexport interface ApiResponse {\n // eslint-disable-next-line\n error?: any;\n // eslint-disable-next-line\n body?: any;\n statusCode: \"ok\" | \"error\";\n status: number;\n}\n\nclass ApiClient {\n private host: string;\n private apiKey: string;\n private userToken: string | null;\n private axiosClient: AxiosInstance;\n private socket: Socket;\n public socketConnected = false;\n\n constructor(options: ApiClientOptions) {\n this.host = options.host;\n this.apiKey = options.apiKey;\n this.userToken = options.userToken || null;\n\n // Create a retryable axios client\n this.axiosClient = axios.create({\n baseURL: this.host,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"X-Knock-User-Token\": this.userToken,\n },\n });\n\n this.socket = new Socket(`${this.host.replace(\"http\", \"ws\")}/ws/v1`, {\n params: {\n user_token: this.userToken,\n api_key: this.apiKey,\n },\n });\n\n axiosRetry(this.axiosClient, {\n retries: 3,\n retryCondition: this.canRetryRequest,\n retryDelay: axiosRetry.exponentialDelay,\n });\n }\n\n connectSocket() {\n if (this.socketConnected) {\n return;\n }\n\n this.socket.connect();\n this.socket.onOpen(() => {\n this.socketConnected = true;\n });\n }\n\n disconnectSocket() {\n this.socket.disconnect();\n return;\n }\n\n createChannel(name: string, params?: object) {\n return this.socket.channel(name, params);\n }\n\n async makeRequest(req: AxiosRequestConfig): Promise<ApiResponse> {\n try {\n const result = await this.axiosClient(req);\n\n return {\n statusCode: result.status < 300 ? \"ok\" : \"error\",\n body: result.data,\n error: undefined,\n status: result.status,\n };\n\n // eslint:disable-next-line\n } catch (e: unknown) {\n console.error(e);\n\n return {\n statusCode: \"error\",\n status: 500,\n body: undefined,\n error: e,\n };\n }\n }\n\n private canRetryRequest(error: AxiosError) {\n // Retry Network Errors.\n if (axiosRetry.isNetworkError(error)) {\n return true;\n }\n\n if (!error.response) {\n // Cannot determine if the request can be retried\n return false;\n }\n\n // Retry Server Errors (5xx).\n if (error.response.status >= 500 && error.response.status <= 599) {\n return true;\n }\n\n // Retry if rate limited.\n if (error.response.status === 429) {\n return true;\n }\n\n return false;\n }\n}\n\nexport default ApiClient;\n"],"file":"api.js"}
|
|
@@ -17,15 +17,15 @@ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/creat
|
|
|
17
17
|
|
|
18
18
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
19
19
|
|
|
20
|
-
var _eventemitter =
|
|
20
|
+
var _eventemitter = require("eventemitter2");
|
|
21
21
|
|
|
22
22
|
var _store = _interopRequireDefault(require("./store"));
|
|
23
23
|
|
|
24
24
|
var _networkStatus = require("../../networkStatus");
|
|
25
25
|
|
|
26
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
|
26
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
27
27
|
|
|
28
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
|
28
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
29
29
|
|
|
30
30
|
var Feed = /*#__PURE__*/function () {
|
|
31
31
|
// The raw store instance, used for binding in React and other environments
|
|
@@ -44,7 +44,10 @@ var Feed = /*#__PURE__*/function () {
|
|
|
44
44
|
this.feedId = feedId;
|
|
45
45
|
this.userFeedId = this.buildUserFeedId();
|
|
46
46
|
this.store = (0, _store["default"])();
|
|
47
|
-
this.broadcaster = new _eventemitter
|
|
47
|
+
this.broadcaster = new _eventemitter.EventEmitter2({
|
|
48
|
+
wildcard: true,
|
|
49
|
+
delimiter: "."
|
|
50
|
+
});
|
|
48
51
|
this.defaultOptions = options; // Try and connect to the socket
|
|
49
52
|
|
|
50
53
|
this.apiClient.connectSocket();
|
|
@@ -327,6 +330,8 @@ var Feed = /*#__PURE__*/function () {
|
|
|
327
330
|
response,
|
|
328
331
|
opts,
|
|
329
332
|
_opts,
|
|
333
|
+
feedEventType,
|
|
334
|
+
eventPayload,
|
|
330
335
|
_args7 = arguments;
|
|
331
336
|
|
|
332
337
|
return _regenerator["default"].wrap(function _callee7$(_context7) {
|
|
@@ -363,7 +368,7 @@ var Feed = /*#__PURE__*/function () {
|
|
|
363
368
|
case 9:
|
|
364
369
|
result = _context7.sent;
|
|
365
370
|
|
|
366
|
-
if (!(result.statusCode === "error")) {
|
|
371
|
+
if (!(result.statusCode === "error" || !result.body)) {
|
|
367
372
|
_context7.next = 13;
|
|
368
373
|
break;
|
|
369
374
|
}
|
|
@@ -403,15 +408,24 @@ var Feed = /*#__PURE__*/function () {
|
|
|
403
408
|
setState(function (state) {
|
|
404
409
|
return state.setResult(response);
|
|
405
410
|
});
|
|
406
|
-
}
|
|
411
|
+
} // Legacy `messages.new` event, should be removed in a future version
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
this.broadcast("messages.new", response); // Broadcast the appropriate event type depending on the fetch source
|
|
407
415
|
|
|
408
|
-
|
|
416
|
+
feedEventType = options.__fetchSource === "socket" ? "items.received.realtime" : "items.received.page";
|
|
417
|
+
eventPayload = {
|
|
418
|
+
items: response.entries,
|
|
419
|
+
metadata: response.meta,
|
|
420
|
+
event: feedEventType
|
|
421
|
+
};
|
|
422
|
+
this.broadcast(eventPayload.event, eventPayload);
|
|
409
423
|
return _context7.abrupt("return", {
|
|
410
424
|
data: response,
|
|
411
425
|
status: result.statusCode
|
|
412
426
|
});
|
|
413
427
|
|
|
414
|
-
case
|
|
428
|
+
case 20:
|
|
415
429
|
case "end":
|
|
416
430
|
return _context7.stop();
|
|
417
431
|
}
|
|
@@ -476,7 +490,7 @@ var Feed = /*#__PURE__*/function () {
|
|
|
476
490
|
key: "onNewMessageReceived",
|
|
477
491
|
value: function () {
|
|
478
492
|
var _onNewMessageReceived = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(_ref) {
|
|
479
|
-
var metadata, _this$store3, getState, setState, currentHead;
|
|
493
|
+
var metadata, _this$store3, getState, setState, _getState3, items, currentHead;
|
|
480
494
|
|
|
481
495
|
return _regenerator["default"].wrap(function _callee9$(_context9) {
|
|
482
496
|
while (1) {
|
|
@@ -485,17 +499,19 @@ var Feed = /*#__PURE__*/function () {
|
|
|
485
499
|
metadata = _ref.metadata;
|
|
486
500
|
// Handle the new message coming in
|
|
487
501
|
_this$store3 = this.store, getState = _this$store3.getState, setState = _this$store3.setState;
|
|
488
|
-
|
|
502
|
+
_getState3 = getState(), items = _getState3.items;
|
|
503
|
+
currentHead = items[0]; // Optimistically set the badge counts
|
|
489
504
|
|
|
490
505
|
setState(function (state) {
|
|
491
506
|
return state.setMetadata(metadata);
|
|
492
507
|
}); // Fetch the items before the current head (if it exists)
|
|
493
508
|
|
|
494
509
|
this.fetch({
|
|
495
|
-
before: currentHead === null || currentHead === void 0 ? void 0 : currentHead.__cursor
|
|
510
|
+
before: currentHead === null || currentHead === void 0 ? void 0 : currentHead.__cursor,
|
|
511
|
+
__fetchSource: "socket"
|
|
496
512
|
});
|
|
497
513
|
|
|
498
|
-
case
|
|
514
|
+
case 6:
|
|
499
515
|
case "end":
|
|
500
516
|
return _context9.stop();
|
|
501
517
|
}
|
|
@@ -525,8 +541,8 @@ var Feed = /*#__PURE__*/function () {
|
|
|
525
541
|
}) : [itemOrItems.id];
|
|
526
542
|
|
|
527
543
|
if (badgeCountAttr) {
|
|
528
|
-
var
|
|
529
|
-
metadata =
|
|
544
|
+
var _getState4 = getState(),
|
|
545
|
+
metadata = _getState4.metadata; // Tnis is a hack to determine the direction of whether we're
|
|
530
546
|
// adding or removing from the badge count
|
|
531
547
|
|
|
532
548
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/clients/feed/feed.ts"],"names":["Feed","knock","feedId","options","apiClient","client","userFeedId","buildUserFeedId","store","broadcaster","EventEmitter","defaultOptions","connectSocket","channel","createChannel","channelConnected","join","receive","on","resp","onNewMessageReceived","leave","e","console","error","eventName","callback","off","getState","itemOrItems","now","Date","toISOString","optimisticallyPerformStatusUpdate","seen_at","makeStatusUpdate","read_at","setState","state","shouldRemoveItems","include_archived","normalizedItems","Array","isArray","itemIds","map","item","id","unseenCount","filter","i","length","unreadCount","meta","metadata","total_count","unseen_count","unread_count","entries","items","includes","setResult","page_info","pageInfo","setMetadata","setItemAttrs","archived_at","networkStatus","setNetworkStatus","__loadingType","NetworkStatus","loading","queryParams","makeRequest","method","url","userId","params","result","statusCode","status","data","body","response","before","opts","shouldSetPage","shouldAppend","after","broadcast","fetch","fetchMore","emit","currentHead","__cursor","type","attrs","badgeCountAttr","direction","startsWith","Math","max","message_ids"],"mappings":"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","sourcesContent":["import { Channel } from \"phoenix\";\nimport { StoreApi } from \"zustand\";\nimport EventEmitter from \"eventemitter3\";\nimport ApiClient from \"../../api\";\nimport createStore from \"./store\";\nimport {\n FeedMessagesReceivedPayload,\n FeedRealTimeEvent,\n FeedItemOrItems,\n FeedStoreState,\n} from \"./types\";\nimport { FeedItem, FeedClientOptions, FetchFeedOptions } from \"./interfaces\";\nimport Knock from \"../../knock\";\nimport { isRequestInFlight, NetworkStatus } from \"../../networkStatus\";\n\nexport type Status =\n | \"seen\"\n | \"read\"\n | \"archived\"\n | \"unseen\"\n | \"unread\"\n | \"unarchived\";\n\nclass Feed {\n private apiClient: ApiClient;\n private userFeedId: string;\n private channelConnected: boolean = false;\n private channel: Channel;\n private broadcaster: EventEmitter;\n private defaultOptions: FeedClientOptions;\n\n // The raw store instance, used for binding in React and other environments\n public store: StoreApi<FeedStoreState>;\n\n constructor(\n readonly knock: Knock,\n readonly feedId: string,\n options: FeedClientOptions,\n ) {\n this.apiClient = knock.client();\n this.feedId = feedId;\n this.userFeedId = this.buildUserFeedId();\n this.store = createStore();\n this.broadcaster = new EventEmitter();\n this.defaultOptions = options;\n\n // Try and connect to the socket\n this.apiClient.connectSocket();\n\n this.channel = this.apiClient.createChannel(\n `feeds:${this.userFeedId}`,\n this.defaultOptions,\n );\n }\n\n /*\n Returns a socket to listen for feed updates\n */\n listenForUpdates() {\n if (!this.channelConnected) {\n this.channel.join().receive(\"ok\", () => {\n this.channelConnected = true;\n });\n\n this.channel.on(\"new-message\", (resp) => this.onNewMessageReceived(resp));\n }\n\n return () => {\n try {\n this.channel.leave();\n } catch (e) {\n // tslint:disable-next-line\n console.error(\"error while leaving channel\", e);\n }\n };\n }\n\n /* Binds a handler to be invoked when event occurs */\n on(eventName: FeedRealTimeEvent, callback: () => void) {\n this.broadcaster.on(eventName, callback);\n }\n\n off(eventName: FeedRealTimeEvent, callback: () => void) {\n this.broadcaster.off(eventName, callback);\n }\n\n getState() {\n return this.store.getState();\n }\n\n async markAsSeen(itemOrItems: FeedItemOrItems) {\n const now = new Date().toISOString();\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"seen\",\n { seen_at: now },\n \"unseen_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"seen\");\n }\n\n async markAsUnseen(itemOrItems: FeedItemOrItems) {\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"unseen\",\n { seen_at: null },\n \"unseen_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"unseen\");\n }\n\n async markAsRead(itemOrItems: FeedItemOrItems) {\n const now = new Date().toISOString();\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"read\",\n { read_at: now },\n \"unread_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"read\");\n }\n\n async markAsUnread(itemOrItems: FeedItemOrItems) {\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"unread\",\n { read_at: null },\n \"unread_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"unread\");\n }\n\n /*\n Marking one or more items as archived should:\n\n - Decrement the badge count for any unread / unseen items\n - Remove the item from the feed list, when the include_archived flag is not true)\n\n TODO: how do we handle rollbacks?\n */\n async markAsArchived(itemOrItems: FeedItemOrItems) {\n const { getState, setState } = this.store;\n const state = getState();\n const shouldRemoveItems = this.defaultOptions.include_archived !== true;\n\n const normalizedItems = Array.isArray(itemOrItems)\n ? itemOrItems\n : [itemOrItems];\n\n const itemIds: string[] = normalizedItems.map((item) => item.id);\n\n // If any of the items are unseen or unread, then capture as we'll want to decrement\n // the counts for these in the metadata we have\n const unseenCount = normalizedItems.filter((i) => !i.seen_at).length;\n const unreadCount = normalizedItems.filter((i) => !i.read_at).length;\n\n // Build the new metadata\n const meta = {\n ...state.metadata,\n total_count: state.metadata.total_count - normalizedItems.length,\n unseen_count: state.metadata.unseen_count - unseenCount,\n unread_count: state.metadata.unread_count - unreadCount,\n };\n\n // Perform optimistic updates on the items in the feed\n if (shouldRemoveItems) {\n // Filter the items out of the list\n const entries = state.items.filter((item) => !itemIds.includes(item.id));\n\n setState((state) =>\n state.setResult({ entries, meta, page_info: state.pageInfo }),\n );\n } else {\n setState((state) => {\n state.setMetadata(meta);\n state.setItemAttrs(itemIds, { archived_at: new Date().toISOString() });\n });\n }\n\n return this.makeStatusUpdate(itemOrItems, \"archived\");\n }\n\n async markAsUnarchived(itemOrItems: FeedItemOrItems) {\n this.optimisticallyPerformStatusUpdate(itemOrItems, \"unarchived\", {\n archived_at: null,\n });\n return this.makeStatusUpdate(itemOrItems, \"unarchived\");\n }\n\n /* Fetches the feed content, appending it to the store */\n async fetch(options: FetchFeedOptions = {}) {\n const { setState, getState } = this.store;\n const { networkStatus } = getState();\n\n // If there's an existing request in flight, then do nothing\n if (isRequestInFlight(networkStatus)) {\n return;\n }\n\n // Set the loading type based on the request type it is\n setState((store) =>\n store.setNetworkStatus(options.__loadingType ?? NetworkStatus.loading),\n );\n\n // Always include the default params, if they have been set\n const queryParams = { ...this.defaultOptions, ...options };\n\n const result = await this.apiClient.makeRequest({\n method: \"GET\",\n url: `/v1/users/${this.knock.userId}/feeds/${this.feedId}`,\n params: queryParams,\n });\n\n if (result.statusCode === \"error\") {\n setState((store) => store.setNetworkStatus(NetworkStatus.error));\n\n return {\n status: result.statusCode,\n data: result.error || result.body,\n };\n }\n\n const response = {\n entries: result.body.entries,\n meta: result.body.meta,\n page_info: result.body.page_info,\n };\n\n if (options.before) {\n const opts = { shouldSetPage: false, shouldAppend: true };\n setState((state) => state.setResult(response, opts));\n } else if (options.after) {\n const opts = { shouldSetPage: true, shouldAppend: true };\n setState((state) => state.setResult(response, opts));\n } else {\n setState((state) => state.setResult(response));\n }\n\n this.broadcast(\"messages.new\", response);\n return { data: response, status: result.statusCode };\n }\n\n async fetchNextPage() {\n // Attempts to fetch the next page of results (if we have any)\n const { getState } = this.store;\n const { pageInfo } = getState();\n\n if (!pageInfo.after) {\n // Nothing more to fetch\n return;\n }\n\n this.fetch({\n after: pageInfo.after,\n __loadingType: NetworkStatus.fetchMore,\n });\n }\n\n private broadcast(eventName: FeedRealTimeEvent, data: any) {\n this.broadcaster.emit(eventName, data);\n }\n\n // Invoked when a new real-time message comes in from the socket\n private async onNewMessageReceived({\n metadata,\n }: FeedMessagesReceivedPayload) {\n // Handle the new message coming in\n const { getState, setState } = this.store;\n const currentHead: FeedItem | undefined = getState().items[0];\n // Optimistically set the badge counts\n setState((state) => state.setMetadata(metadata));\n // Fetch the items before the current head (if it exists)\n this.fetch({ before: currentHead?.__cursor });\n }\n\n private buildUserFeedId() {\n return `${this.feedId}:${this.knock.userId}`;\n }\n\n private optimisticallyPerformStatusUpdate(\n itemOrItems: FeedItemOrItems,\n type: Status,\n attrs: object,\n badgeCountAttr?: \"unread_count\" | \"unseen_count\",\n ) {\n const { getState, setState } = this.store;\n const itemIds = Array.isArray(itemOrItems)\n ? itemOrItems.map((item) => item.id)\n : [itemOrItems.id];\n\n if (badgeCountAttr) {\n const { metadata } = getState();\n\n // Tnis is a hack to determine the direction of whether we're\n // adding or removing from the badge count\n const direction = type.startsWith(\"un\")\n ? itemIds.length\n : -itemIds.length;\n\n setState((store) =>\n store.setMetadata({\n ...metadata,\n [badgeCountAttr]: Math.max(0, metadata[badgeCountAttr] + direction),\n }),\n );\n }\n\n // Update the items with the given attributes\n setState((store) => store.setItemAttrs(itemIds, attrs));\n }\n\n private async makeStatusUpdate(itemOrItems: FeedItemOrItems, type: Status) {\n // If we're interacting with an array, then we want to send this as a batch\n if (Array.isArray(itemOrItems)) {\n const itemIds = itemOrItems.map((item) => item.id);\n\n return await this.apiClient.makeRequest({\n method: \"POST\",\n url: `/v1/messages/batch/${type}`,\n data: { message_ids: itemIds },\n });\n }\n\n // If its a single then we can just call the regular endpoint\n const result = await this.apiClient.makeRequest({\n method: type.startsWith(\"un\") ? \"DELETE\" : \"PUT\",\n url: `/v1/messages/${itemOrItems.id}/${type}`,\n });\n\n return result;\n }\n}\n\nexport default Feed;\n"],"file":"feed.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/clients/feed/feed.ts"],"names":["Feed","knock","feedId","options","apiClient","client","userFeedId","buildUserFeedId","store","broadcaster","EventEmitter","wildcard","delimiter","defaultOptions","connectSocket","channel","createChannel","channelConnected","join","receive","on","resp","onNewMessageReceived","leave","e","console","error","eventName","callback","off","getState","itemOrItems","now","Date","toISOString","optimisticallyPerformStatusUpdate","seen_at","makeStatusUpdate","read_at","setState","state","shouldRemoveItems","include_archived","normalizedItems","Array","isArray","itemIds","map","item","id","unseenCount","filter","i","length","unreadCount","meta","metadata","total_count","unseen_count","unread_count","entries","items","includes","setResult","page_info","pageInfo","setMetadata","setItemAttrs","archived_at","networkStatus","setNetworkStatus","__loadingType","NetworkStatus","loading","queryParams","makeRequest","method","url","userId","params","result","statusCode","body","status","data","response","before","opts","shouldSetPage","shouldAppend","after","broadcast","feedEventType","__fetchSource","eventPayload","event","fetch","fetchMore","emit","currentHead","__cursor","type","attrs","badgeCountAttr","direction","startsWith","Math","max","message_ids"],"mappings":"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","sourcesContent":["import { Channel } from \"phoenix\";\nimport { StoreApi } from \"zustand\";\nimport { EventEmitter2 as EventEmitter } from \"eventemitter2\";\nimport ApiClient from \"../../api\";\nimport createStore from \"./store\";\nimport {\n BindableFeedEvent,\n FeedMessagesReceivedPayload,\n FeedEventCallback,\n FeedEvent,\n FeedItemOrItems,\n FeedStoreState,\n FeedEventPayload,\n FeedRealTimeCallback,\n} from \"./types\";\nimport {\n FeedItem,\n FeedClientOptions,\n FetchFeedOptions,\n FeedResponse,\n FeedMetadata,\n} from \"./interfaces\";\nimport Knock from \"../../knock\";\nimport { isRequestInFlight, NetworkStatus } from \"../../networkStatus\";\n\nexport type Status =\n | \"seen\"\n | \"read\"\n | \"archived\"\n | \"unseen\"\n | \"unread\"\n | \"unarchived\";\n\nclass Feed {\n private apiClient: ApiClient;\n private userFeedId: string;\n private channelConnected = false;\n private channel: Channel;\n private broadcaster: EventEmitter;\n private defaultOptions: FeedClientOptions;\n\n // The raw store instance, used for binding in React and other environments\n public store: StoreApi<FeedStoreState>;\n\n constructor(\n readonly knock: Knock,\n readonly feedId: string,\n options: FeedClientOptions,\n ) {\n this.apiClient = knock.client();\n this.feedId = feedId;\n this.userFeedId = this.buildUserFeedId();\n this.store = createStore();\n this.broadcaster = new EventEmitter({ wildcard: true, delimiter: \".\" });\n this.defaultOptions = options;\n\n // Try and connect to the socket\n this.apiClient.connectSocket();\n\n this.channel = this.apiClient.createChannel(\n `feeds:${this.userFeedId}`,\n this.defaultOptions,\n );\n }\n\n /*\n Returns a socket to listen for feed updates\n */\n listenForUpdates() {\n if (!this.channelConnected) {\n this.channel.join().receive(\"ok\", () => {\n this.channelConnected = true;\n });\n\n this.channel.on(\"new-message\", (resp) => this.onNewMessageReceived(resp));\n }\n\n return () => {\n try {\n this.channel.leave();\n } catch (e) {\n // tslint:disable-next-line\n console.error(\"error while leaving channel\", e);\n }\n };\n }\n\n /* Binds a handler to be invoked when event occurs */\n on(\n eventName: BindableFeedEvent,\n callback: FeedEventCallback | FeedRealTimeCallback,\n ) {\n this.broadcaster.on(eventName, callback);\n }\n\n off(\n eventName: BindableFeedEvent,\n callback: FeedEventCallback | FeedRealTimeCallback,\n ) {\n this.broadcaster.off(eventName, callback);\n }\n\n getState() {\n return this.store.getState();\n }\n\n async markAsSeen(itemOrItems: FeedItemOrItems) {\n const now = new Date().toISOString();\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"seen\",\n { seen_at: now },\n \"unseen_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"seen\");\n }\n\n async markAsUnseen(itemOrItems: FeedItemOrItems) {\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"unseen\",\n { seen_at: null },\n \"unseen_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"unseen\");\n }\n\n async markAsRead(itemOrItems: FeedItemOrItems) {\n const now = new Date().toISOString();\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"read\",\n { read_at: now },\n \"unread_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"read\");\n }\n\n async markAsUnread(itemOrItems: FeedItemOrItems) {\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"unread\",\n { read_at: null },\n \"unread_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"unread\");\n }\n\n /*\n Marking one or more items as archived should:\n\n - Decrement the badge count for any unread / unseen items\n - Remove the item from the feed list, when the include_archived flag is not true)\n\n TODO: how do we handle rollbacks?\n */\n async markAsArchived(itemOrItems: FeedItemOrItems) {\n const { getState, setState } = this.store;\n const state = getState();\n const shouldRemoveItems = this.defaultOptions.include_archived !== true;\n\n const normalizedItems = Array.isArray(itemOrItems)\n ? itemOrItems\n : [itemOrItems];\n\n const itemIds: string[] = normalizedItems.map((item) => item.id);\n\n // If any of the items are unseen or unread, then capture as we'll want to decrement\n // the counts for these in the metadata we have\n const unseenCount = normalizedItems.filter((i) => !i.seen_at).length;\n const unreadCount = normalizedItems.filter((i) => !i.read_at).length;\n\n // Build the new metadata\n const meta = {\n ...state.metadata,\n total_count: state.metadata.total_count - normalizedItems.length,\n unseen_count: state.metadata.unseen_count - unseenCount,\n unread_count: state.metadata.unread_count - unreadCount,\n };\n\n // Perform optimistic updates on the items in the feed\n if (shouldRemoveItems) {\n // Filter the items out of the list\n const entries = state.items.filter((item) => !itemIds.includes(item.id));\n\n setState((state) =>\n state.setResult({ entries, meta, page_info: state.pageInfo }),\n );\n } else {\n setState((state) => {\n state.setMetadata(meta);\n state.setItemAttrs(itemIds, { archived_at: new Date().toISOString() });\n });\n }\n\n return this.makeStatusUpdate(itemOrItems, \"archived\");\n }\n\n async markAsUnarchived(itemOrItems: FeedItemOrItems) {\n this.optimisticallyPerformStatusUpdate(itemOrItems, \"unarchived\", {\n archived_at: null,\n });\n return this.makeStatusUpdate(itemOrItems, \"unarchived\");\n }\n\n /* Fetches the feed content, appending it to the store */\n async fetch(options: FetchFeedOptions = {}) {\n const { setState, getState } = this.store;\n const { networkStatus } = getState();\n\n // If there's an existing request in flight, then do nothing\n if (isRequestInFlight(networkStatus)) {\n return;\n }\n\n // Set the loading type based on the request type it is\n setState((store) =>\n store.setNetworkStatus(options.__loadingType ?? NetworkStatus.loading),\n );\n\n // Always include the default params, if they have been set\n const queryParams = { ...this.defaultOptions, ...options };\n\n const result = await this.apiClient.makeRequest({\n method: \"GET\",\n url: `/v1/users/${this.knock.userId}/feeds/${this.feedId}`,\n params: queryParams,\n });\n\n if (result.statusCode === \"error\" || !result.body) {\n setState((store) => store.setNetworkStatus(NetworkStatus.error));\n\n return {\n status: result.statusCode,\n data: result.error || result.body,\n };\n }\n\n const response = {\n entries: result.body.entries,\n meta: result.body.meta,\n page_info: result.body.page_info,\n };\n\n if (options.before) {\n const opts = { shouldSetPage: false, shouldAppend: true };\n setState((state) => state.setResult(response, opts));\n } else if (options.after) {\n const opts = { shouldSetPage: true, shouldAppend: true };\n setState((state) => state.setResult(response, opts));\n } else {\n setState((state) => state.setResult(response));\n }\n\n // Legacy `messages.new` event, should be removed in a future version\n this.broadcast(\"messages.new\", response);\n\n // Broadcast the appropriate event type depending on the fetch source\n const feedEventType: FeedEvent =\n options.__fetchSource === \"socket\"\n ? \"items.received.realtime\"\n : \"items.received.page\";\n\n const eventPayload = {\n items: response.entries as FeedItem[],\n metadata: response.meta as FeedMetadata,\n event: feedEventType,\n };\n\n this.broadcast(eventPayload.event, eventPayload);\n\n return { data: response, status: result.statusCode };\n }\n\n async fetchNextPage() {\n // Attempts to fetch the next page of results (if we have any)\n const { getState } = this.store;\n const { pageInfo } = getState();\n\n if (!pageInfo.after) {\n // Nothing more to fetch\n return;\n }\n\n this.fetch({\n after: pageInfo.after,\n __loadingType: NetworkStatus.fetchMore,\n });\n }\n\n private broadcast(\n eventName: FeedEvent,\n data: FeedResponse | FeedEventPayload,\n ) {\n this.broadcaster.emit(eventName, data);\n }\n\n // Invoked when a new real-time message comes in from the socket\n private async onNewMessageReceived({\n metadata,\n }: FeedMessagesReceivedPayload) {\n // Handle the new message coming in\n const { getState, setState } = this.store;\n const { items } = getState();\n const currentHead: FeedItem | undefined = items[0];\n // Optimistically set the badge counts\n setState((state) => state.setMetadata(metadata));\n // Fetch the items before the current head (if it exists)\n this.fetch({ before: currentHead?.__cursor, __fetchSource: \"socket\" });\n }\n\n private buildUserFeedId() {\n return `${this.feedId}:${this.knock.userId}`;\n }\n\n private optimisticallyPerformStatusUpdate(\n itemOrItems: FeedItemOrItems,\n type: Status,\n attrs: object,\n badgeCountAttr?: \"unread_count\" | \"unseen_count\",\n ) {\n const { getState, setState } = this.store;\n const itemIds = Array.isArray(itemOrItems)\n ? itemOrItems.map((item) => item.id)\n : [itemOrItems.id];\n\n if (badgeCountAttr) {\n const { metadata } = getState();\n\n // Tnis is a hack to determine the direction of whether we're\n // adding or removing from the badge count\n const direction = type.startsWith(\"un\")\n ? itemIds.length\n : -itemIds.length;\n\n setState((store) =>\n store.setMetadata({\n ...metadata,\n [badgeCountAttr]: Math.max(0, metadata[badgeCountAttr] + direction),\n }),\n );\n }\n\n // Update the items with the given attributes\n setState((store) => store.setItemAttrs(itemIds, attrs));\n }\n\n private async makeStatusUpdate(itemOrItems: FeedItemOrItems, type: Status) {\n // If we're interacting with an array, then we want to send this as a batch\n if (Array.isArray(itemOrItems)) {\n const itemIds = itemOrItems.map((item) => item.id);\n\n return await this.apiClient.makeRequest({\n method: \"POST\",\n url: `/v1/messages/batch/${type}`,\n data: { message_ids: itemIds },\n });\n }\n\n // If its a single then we can just call the regular endpoint\n const result = await this.apiClient.makeRequest({\n method: type.startsWith(\"un\") ? \"DELETE\" : \"PUT\",\n url: `/v1/messages/${itemOrItems.id}/${type}`,\n });\n\n return result;\n }\n}\n\nexport default Feed;\n"],"file":"feed.js"}
|
|
@@ -15,9 +15,9 @@ var _networkStatus = require("../../networkStatus");
|
|
|
15
15
|
|
|
16
16
|
var _utils = require("./utils");
|
|
17
17
|
|
|
18
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
|
18
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
19
19
|
|
|
20
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
|
20
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
21
21
|
|
|
22
22
|
function processItems(items) {
|
|
23
23
|
var deduped = (0, _utils.deduplicateItems)(items);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/clients/feed/store.ts"],"names":["processItems","items","deduped","sorted","defaultSetResultOptions","shouldSetPage","shouldAppend","createStore","set","networkStatus","NetworkStatus","ready","loading","metadata","total_count","unread_count","unseen_count","pageInfo","before","after","page_size","setLoading","setNetworkStatus","setResult","entries","meta","page_info","options","state","concat","setMetadata","setItemAttrs","itemIds","attrs","itemUpdatesMap","reduce","acc","itemId","map","item","id"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AAGA;;;;;;AAEA,SAASA,YAAT,CAAsBC,KAAtB,EAAyC;AACvC,MAAMC,OAAO,GAAG,6BAAiBD,KAAjB,CAAhB;AACA,MAAME,MAAM,GAAG,sBAAUD,OAAV,CAAf;AAEA,SAAOC,MAAP;AACD;;AAED,IAAMC,uBAAuB,GAAG;AAC9BC,EAAAA,aAAa,EAAE,IADe;AAE9BC,EAAAA,YAAY,EAAE;AAFgB,CAAhC;;AAKe,SAASC,WAAT,GAAuB;AACpC,SAAO,yBAAuB,UAACC,GAAD;AAAA,WAAU;AACtC;AACAP,MAAAA,KAAK,EAAE,EAF+B;AAItC;AACAQ,MAAAA,aAAa,EAAEC,6BAAcC,KALS;AAMtCC,MAAAA,OAAO,EAAE,KAN6B;AAQtC;AACAC,MAAAA,QAAQ,EAAE;AACRC,QAAAA,WAAW,EAAE,CADL;AAERC,QAAAA,YAAY,EAAE,CAFN;AAGRC,QAAAA,YAAY,EAAE;AAHN,OAT4B;AAetC;AACAC,MAAAA,QAAQ,EAAE;AACRC,QAAAA,MAAM,EAAE,IADA;AAERC,QAAAA,KAAK,EAAE,IAFC;AAGRC,QAAAA,SAAS,EAAE;AAHH,OAhB4B;AAsBtC;AACA;AACAC,MAAAA,UAAU,EAAE,oBAACT,OAAD;AAAA,eAAaJ,GAAG,CAAC;AAAA,iBAAO;AAAEI,YAAAA,OAAO,EAAPA;AAAF,WAAP;AAAA,SAAD,CAAhB;AAAA,OAxB0B;AA0BtCU,MAAAA,gBAAgB,EAAE,0BAACb,aAAD;AAAA,eAChBD,GAAG,CAAC;AAAA,iBAAO;AACTC,YAAAA,aAAa,EAAbA,aADS;AAETG,YAAAA,OAAO,EAAEH,aAAa,KAAKC,6BAAcE;AAFhC,WAAP;AAAA,SAAD,CADa;AAAA,OA1BoB;AAgCtCW,MAAAA,SAAS,EAAE;AAAA,YACPC,OADO,QACPA,OADO;AAAA,YACEC,IADF,QACEA,IADF;AAAA,YACQC,SADR,QACQA,SADR;AAAA,YAETC,OAFS,uEAECvB,uBAFD;AAAA,eAITI,GAAG,CAAC,UAACoB,KAAD,EAAW;AACb;AACA,cAAM3B,KAAK,GAAG0B,OAAO,CAACrB,YAAR,GACVN,YAAY,CAAC4B,KAAK,CAAC3B,KAAN,CAAY4B,MAAZ,CAAmBL,OAAnB,CAAD,CADF,GAEVA,OAFJ;AAIA,iBAAO;AACLvB,YAAAA,KAAK,EAALA,KADK;AAELY,YAAAA,QAAQ,EAAEY,IAFL;AAGLR,YAAAA,QAAQ,EAAEU,OAAO,CAACtB,aAAR,GAAwBqB,SAAxB,GAAoCE,KAAK,CAACX,QAH/C;AAILL,YAAAA,OAAO,EAAE,KAJJ;AAKLH,YAAAA,aAAa,EAAEC,6BAAcC;AALxB,WAAP;AAOD,SAbE,CAJM;AAAA,OAhC2B;AAmDtCmB,MAAAA,WAAW,EAAE,qBAACjB,QAAD;AAAA,eAAcL,GAAG,CAAC;AAAA,iBAAO;AAAEK,YAAAA,QAAQ,EAARA;AAAF,WAAP;AAAA,SAAD,CAAjB;AAAA,OAnDyB;
|
|
1
|
+
{"version":3,"sources":["../../../../src/clients/feed/store.ts"],"names":["processItems","items","deduped","sorted","defaultSetResultOptions","shouldSetPage","shouldAppend","createStore","set","networkStatus","NetworkStatus","ready","loading","metadata","total_count","unread_count","unseen_count","pageInfo","before","after","page_size","setLoading","setNetworkStatus","setResult","entries","meta","page_info","options","state","concat","setMetadata","setItemAttrs","itemIds","attrs","itemUpdatesMap","reduce","acc","itemId","map","item","id"],"mappings":"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","sourcesContent":["import create from \"zustand/vanilla\";\nimport { NetworkStatus } from \"../../networkStatus\";\nimport { FeedItem } from \"./interfaces\";\nimport { FeedStoreState } from \"./types\";\nimport { deduplicateItems, sortItems } from \"./utils\";\n\nfunction processItems(items: FeedItem[]) {\n const deduped = deduplicateItems(items);\n const sorted = sortItems(deduped);\n\n return sorted;\n}\n\nconst defaultSetResultOptions = {\n shouldSetPage: true,\n shouldAppend: false,\n};\n\nexport default function createStore() {\n return create<FeedStoreState>((set) => ({\n // Keeps track of all of the items loaded\n items: [],\n\n // The network status indicates what's happening with the request\n networkStatus: NetworkStatus.ready,\n loading: false,\n\n // Keeps track of the current badge counts\n metadata: {\n total_count: 0,\n unread_count: 0,\n unseen_count: 0,\n },\n\n // Keeps track of the last full page of results we received (for paginating)\n pageInfo: {\n before: null,\n after: null,\n page_size: 50,\n },\n\n // TODO: remove this function from the store as we're now using the\n // `setNetworkStatus` function to derive this information instead\n setLoading: (loading) => set(() => ({ loading })),\n\n setNetworkStatus: (networkStatus: NetworkStatus) =>\n set(() => ({\n networkStatus,\n loading: networkStatus === NetworkStatus.loading,\n })),\n\n setResult: (\n { entries, meta, page_info },\n options = defaultSetResultOptions,\n ) =>\n set((state) => {\n // We resort the list on set, so concating everything is fine (if a bit suboptimal)\n const items = options.shouldAppend\n ? processItems(state.items.concat(entries))\n : entries;\n\n return {\n items,\n metadata: meta,\n pageInfo: options.shouldSetPage ? page_info : state.pageInfo,\n loading: false,\n networkStatus: NetworkStatus.ready,\n };\n }),\n\n setMetadata: (metadata) => set(() => ({ metadata })),\n\n setItemAttrs: (itemIds, attrs) => {\n // Create a map for the items to the updates to be made\n const itemUpdatesMap: { [id: string]: object } = itemIds.reduce(\n (acc, itemId) => ({ ...acc, [itemId]: attrs }),\n {},\n );\n\n return set((state) => {\n const items = state.items.map((item) => {\n if (itemUpdatesMap[item.id]) {\n return { ...item, ...itemUpdatesMap[item.id] };\n }\n\n return item;\n });\n\n return { items };\n });\n },\n }));\n}\n"],"file":"store.js"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -11,16 +11,16 @@ var _exportNames = {
|
|
|
11
11
|
FeedClient: true,
|
|
12
12
|
Feed: true
|
|
13
13
|
};
|
|
14
|
-
Object.defineProperty(exports, "
|
|
14
|
+
Object.defineProperty(exports, "Feed", {
|
|
15
15
|
enumerable: true,
|
|
16
16
|
get: function get() {
|
|
17
|
-
return _feed
|
|
17
|
+
return _feed.Feed;
|
|
18
18
|
}
|
|
19
19
|
});
|
|
20
|
-
Object.defineProperty(exports, "
|
|
20
|
+
Object.defineProperty(exports, "FeedClient", {
|
|
21
21
|
enumerable: true,
|
|
22
22
|
get: function get() {
|
|
23
|
-
return _feed
|
|
23
|
+
return _feed["default"];
|
|
24
24
|
}
|
|
25
25
|
});
|
|
26
26
|
exports["default"] = void 0;
|
package/dist/cjs/interfaces.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.isRequestInFlight = isRequestInFlight;
|
|
7
6
|
exports.NetworkStatus = void 0;
|
|
7
|
+
exports.isRequestInFlight = isRequestInFlight;
|
|
8
8
|
var NetworkStatus;
|
|
9
9
|
exports.NetworkStatus = NetworkStatus;
|
|
10
10
|
|
package/dist/esm/api.js
CHANGED
package/dist/esm/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/api.ts"],"names":["axios","axiosRetry","Socket","ApiClient","constructor","options","host","apiKey","userToken","axiosClient","create","baseURL","headers","Accept","Authorization","socket","replace","params","user_token","api_key","retries","retryCondition","canRetryRequest","retryDelay","exponentialDelay","connectSocket","socketConnected","connect","onOpen","disconnectSocket","disconnect","createChannel","name","channel","makeRequest","req","result","statusCode","status","body","data","error","undefined","e","console","isNetworkError","response"],"mappings":";;AAAA,OAAOA,KAAP,MAAyD,OAAzD;AACA,OAAOC,UAAP,MAAuB,aAAvB;AACA,SAASC,MAAT,QAAuB,SAAvB;;
|
|
1
|
+
{"version":3,"sources":["../../src/api.ts"],"names":["axios","axiosRetry","Socket","ApiClient","constructor","options","host","apiKey","userToken","axiosClient","create","baseURL","headers","Accept","Authorization","socket","replace","params","user_token","api_key","retries","retryCondition","canRetryRequest","retryDelay","exponentialDelay","connectSocket","socketConnected","connect","onOpen","disconnectSocket","disconnect","createChannel","name","channel","makeRequest","req","result","statusCode","status","body","data","error","undefined","e","console","isNetworkError","response"],"mappings":"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","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig } from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport { Socket } from \"phoenix\";\nimport { AxiosError } from \"axios\";\n\ntype ApiClientOptions = {\n host: string;\n apiKey: string;\n userToken: string | undefined;\n};\n\nexport interface ApiResponse {\n // eslint-disable-next-line\n error?: any;\n // eslint-disable-next-line\n body?: any;\n statusCode: \"ok\" | \"error\";\n status: number;\n}\n\nclass ApiClient {\n private host: string;\n private apiKey: string;\n private userToken: string | null;\n private axiosClient: AxiosInstance;\n private socket: Socket;\n public socketConnected = false;\n\n constructor(options: ApiClientOptions) {\n this.host = options.host;\n this.apiKey = options.apiKey;\n this.userToken = options.userToken || null;\n\n // Create a retryable axios client\n this.axiosClient = axios.create({\n baseURL: this.host,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"X-Knock-User-Token\": this.userToken,\n },\n });\n\n this.socket = new Socket(`${this.host.replace(\"http\", \"ws\")}/ws/v1`, {\n params: {\n user_token: this.userToken,\n api_key: this.apiKey,\n },\n });\n\n axiosRetry(this.axiosClient, {\n retries: 3,\n retryCondition: this.canRetryRequest,\n retryDelay: axiosRetry.exponentialDelay,\n });\n }\n\n connectSocket() {\n if (this.socketConnected) {\n return;\n }\n\n this.socket.connect();\n this.socket.onOpen(() => {\n this.socketConnected = true;\n });\n }\n\n disconnectSocket() {\n this.socket.disconnect();\n return;\n }\n\n createChannel(name: string, params?: object) {\n return this.socket.channel(name, params);\n }\n\n async makeRequest(req: AxiosRequestConfig): Promise<ApiResponse> {\n try {\n const result = await this.axiosClient(req);\n\n return {\n statusCode: result.status < 300 ? \"ok\" : \"error\",\n body: result.data,\n error: undefined,\n status: result.status,\n };\n\n // eslint:disable-next-line\n } catch (e: unknown) {\n console.error(e);\n\n return {\n statusCode: \"error\",\n status: 500,\n body: undefined,\n error: e,\n };\n }\n }\n\n private canRetryRequest(error: AxiosError) {\n // Retry Network Errors.\n if (axiosRetry.isNetworkError(error)) {\n return true;\n }\n\n if (!error.response) {\n // Cannot determine if the request can be retried\n return false;\n }\n\n // Retry Server Errors (5xx).\n if (error.response.status >= 500 && error.response.status <= 599) {\n return true;\n }\n\n // Retry if rate limited.\n if (error.response.status === 429) {\n return true;\n }\n\n return false;\n }\n}\n\nexport default ApiClient;\n"],"file":"api.js"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
2
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
3
|
|
|
4
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
|
4
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
5
5
|
|
|
6
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
|
6
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
7
7
|
|
|
8
|
-
import EventEmitter from "
|
|
8
|
+
import { EventEmitter2 as EventEmitter } from "eventemitter2";
|
|
9
9
|
import createStore from "./store";
|
|
10
10
|
import { isRequestInFlight, NetworkStatus } from "../../networkStatus";
|
|
11
11
|
|
|
@@ -33,7 +33,10 @@ class Feed {
|
|
|
33
33
|
this.feedId = feedId;
|
|
34
34
|
this.userFeedId = this.buildUserFeedId();
|
|
35
35
|
this.store = createStore();
|
|
36
|
-
this.broadcaster = new EventEmitter(
|
|
36
|
+
this.broadcaster = new EventEmitter({
|
|
37
|
+
wildcard: true,
|
|
38
|
+
delimiter: "."
|
|
39
|
+
});
|
|
37
40
|
this.defaultOptions = options; // Try and connect to the socket
|
|
38
41
|
|
|
39
42
|
this.apiClient.connectSocket();
|
|
@@ -227,7 +230,7 @@ class Feed {
|
|
|
227
230
|
params: queryParams
|
|
228
231
|
});
|
|
229
232
|
|
|
230
|
-
if (result.statusCode === "error") {
|
|
233
|
+
if (result.statusCode === "error" || !result.body) {
|
|
231
234
|
setState(store => store.setNetworkStatus(NetworkStatus.error));
|
|
232
235
|
return {
|
|
233
236
|
status: result.statusCode,
|
|
@@ -255,9 +258,20 @@ class Feed {
|
|
|
255
258
|
setState(state => state.setResult(response, _opts));
|
|
256
259
|
} else {
|
|
257
260
|
setState(state => state.setResult(response));
|
|
258
|
-
}
|
|
261
|
+
} // Legacy `messages.new` event, should be removed in a future version
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
_this7.broadcast("messages.new", response); // Broadcast the appropriate event type depending on the fetch source
|
|
265
|
+
|
|
259
266
|
|
|
260
|
-
|
|
267
|
+
var feedEventType = options.__fetchSource === "socket" ? "items.received.realtime" : "items.received.page";
|
|
268
|
+
var eventPayload = {
|
|
269
|
+
items: response.entries,
|
|
270
|
+
metadata: response.meta,
|
|
271
|
+
event: feedEventType
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
_this7.broadcast(eventPayload.event, eventPayload);
|
|
261
275
|
|
|
262
276
|
return {
|
|
263
277
|
data: response,
|
|
@@ -307,12 +321,16 @@ class Feed {
|
|
|
307
321
|
getState,
|
|
308
322
|
setState
|
|
309
323
|
} = _this9.store;
|
|
310
|
-
var
|
|
324
|
+
var {
|
|
325
|
+
items
|
|
326
|
+
} = getState();
|
|
327
|
+
var currentHead = items[0]; // Optimistically set the badge counts
|
|
311
328
|
|
|
312
329
|
setState(state => state.setMetadata(metadata)); // Fetch the items before the current head (if it exists)
|
|
313
330
|
|
|
314
331
|
_this9.fetch({
|
|
315
|
-
before: currentHead === null || currentHead === void 0 ? void 0 : currentHead.__cursor
|
|
332
|
+
before: currentHead === null || currentHead === void 0 ? void 0 : currentHead.__cursor,
|
|
333
|
+
__fetchSource: "socket"
|
|
316
334
|
});
|
|
317
335
|
})();
|
|
318
336
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/clients/feed/feed.ts"],"names":["EventEmitter","createStore","isRequestInFlight","NetworkStatus","Feed","constructor","knock","feedId","options","apiClient","client","userFeedId","buildUserFeedId","store","broadcaster","defaultOptions","connectSocket","channel","createChannel","listenForUpdates","channelConnected","join","receive","on","resp","onNewMessageReceived","leave","e","console","error","eventName","callback","off","getState","markAsSeen","itemOrItems","now","Date","toISOString","optimisticallyPerformStatusUpdate","seen_at","makeStatusUpdate","markAsUnseen","markAsRead","read_at","markAsUnread","markAsArchived","setState","state","shouldRemoveItems","include_archived","normalizedItems","Array","isArray","itemIds","map","item","id","unseenCount","filter","i","length","unreadCount","meta","metadata","total_count","unseen_count","unread_count","entries","items","includes","setResult","page_info","pageInfo","setMetadata","setItemAttrs","archived_at","markAsUnarchived","fetch","networkStatus","setNetworkStatus","__loadingType","loading","queryParams","result","makeRequest","method","url","userId","params","statusCode","status","data","body","response","before","opts","shouldSetPage","shouldAppend","after","broadcast","fetchNextPage","fetchMore","emit","currentHead","__cursor","type","attrs","badgeCountAttr","direction","startsWith","Math","max","message_ids"],"mappings":"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","sourcesContent":["import { Channel } from \"phoenix\";\nimport { StoreApi } from \"zustand\";\nimport EventEmitter from \"eventemitter3\";\nimport ApiClient from \"../../api\";\nimport createStore from \"./store\";\nimport {\n FeedMessagesReceivedPayload,\n FeedRealTimeEvent,\n FeedItemOrItems,\n FeedStoreState,\n} from \"./types\";\nimport { FeedItem, FeedClientOptions, FetchFeedOptions } from \"./interfaces\";\nimport Knock from \"../../knock\";\nimport { isRequestInFlight, NetworkStatus } from \"../../networkStatus\";\n\nexport type Status =\n | \"seen\"\n | \"read\"\n | \"archived\"\n | \"unseen\"\n | \"unread\"\n | \"unarchived\";\n\nclass Feed {\n private apiClient: ApiClient;\n private userFeedId: string;\n private channelConnected: boolean = false;\n private channel: Channel;\n private broadcaster: EventEmitter;\n private defaultOptions: FeedClientOptions;\n\n // The raw store instance, used for binding in React and other environments\n public store: StoreApi<FeedStoreState>;\n\n constructor(\n readonly knock: Knock,\n readonly feedId: string,\n options: FeedClientOptions,\n ) {\n this.apiClient = knock.client();\n this.feedId = feedId;\n this.userFeedId = this.buildUserFeedId();\n this.store = createStore();\n this.broadcaster = new EventEmitter();\n this.defaultOptions = options;\n\n // Try and connect to the socket\n this.apiClient.connectSocket();\n\n this.channel = this.apiClient.createChannel(\n `feeds:${this.userFeedId}`,\n this.defaultOptions,\n );\n }\n\n /*\n Returns a socket to listen for feed updates\n */\n listenForUpdates() {\n if (!this.channelConnected) {\n this.channel.join().receive(\"ok\", () => {\n this.channelConnected = true;\n });\n\n this.channel.on(\"new-message\", (resp) => this.onNewMessageReceived(resp));\n }\n\n return () => {\n try {\n this.channel.leave();\n } catch (e) {\n // tslint:disable-next-line\n console.error(\"error while leaving channel\", e);\n }\n };\n }\n\n /* Binds a handler to be invoked when event occurs */\n on(eventName: FeedRealTimeEvent, callback: () => void) {\n this.broadcaster.on(eventName, callback);\n }\n\n off(eventName: FeedRealTimeEvent, callback: () => void) {\n this.broadcaster.off(eventName, callback);\n }\n\n getState() {\n return this.store.getState();\n }\n\n async markAsSeen(itemOrItems: FeedItemOrItems) {\n const now = new Date().toISOString();\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"seen\",\n { seen_at: now },\n \"unseen_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"seen\");\n }\n\n async markAsUnseen(itemOrItems: FeedItemOrItems) {\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"unseen\",\n { seen_at: null },\n \"unseen_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"unseen\");\n }\n\n async markAsRead(itemOrItems: FeedItemOrItems) {\n const now = new Date().toISOString();\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"read\",\n { read_at: now },\n \"unread_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"read\");\n }\n\n async markAsUnread(itemOrItems: FeedItemOrItems) {\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"unread\",\n { read_at: null },\n \"unread_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"unread\");\n }\n\n /*\n Marking one or more items as archived should:\n\n - Decrement the badge count for any unread / unseen items\n - Remove the item from the feed list, when the include_archived flag is not true)\n\n TODO: how do we handle rollbacks?\n */\n async markAsArchived(itemOrItems: FeedItemOrItems) {\n const { getState, setState } = this.store;\n const state = getState();\n const shouldRemoveItems = this.defaultOptions.include_archived !== true;\n\n const normalizedItems = Array.isArray(itemOrItems)\n ? itemOrItems\n : [itemOrItems];\n\n const itemIds: string[] = normalizedItems.map((item) => item.id);\n\n // If any of the items are unseen or unread, then capture as we'll want to decrement\n // the counts for these in the metadata we have\n const unseenCount = normalizedItems.filter((i) => !i.seen_at).length;\n const unreadCount = normalizedItems.filter((i) => !i.read_at).length;\n\n // Build the new metadata\n const meta = {\n ...state.metadata,\n total_count: state.metadata.total_count - normalizedItems.length,\n unseen_count: state.metadata.unseen_count - unseenCount,\n unread_count: state.metadata.unread_count - unreadCount,\n };\n\n // Perform optimistic updates on the items in the feed\n if (shouldRemoveItems) {\n // Filter the items out of the list\n const entries = state.items.filter((item) => !itemIds.includes(item.id));\n\n setState((state) =>\n state.setResult({ entries, meta, page_info: state.pageInfo }),\n );\n } else {\n setState((state) => {\n state.setMetadata(meta);\n state.setItemAttrs(itemIds, { archived_at: new Date().toISOString() });\n });\n }\n\n return this.makeStatusUpdate(itemOrItems, \"archived\");\n }\n\n async markAsUnarchived(itemOrItems: FeedItemOrItems) {\n this.optimisticallyPerformStatusUpdate(itemOrItems, \"unarchived\", {\n archived_at: null,\n });\n return this.makeStatusUpdate(itemOrItems, \"unarchived\");\n }\n\n /* Fetches the feed content, appending it to the store */\n async fetch(options: FetchFeedOptions = {}) {\n const { setState, getState } = this.store;\n const { networkStatus } = getState();\n\n // If there's an existing request in flight, then do nothing\n if (isRequestInFlight(networkStatus)) {\n return;\n }\n\n // Set the loading type based on the request type it is\n setState((store) =>\n store.setNetworkStatus(options.__loadingType ?? NetworkStatus.loading),\n );\n\n // Always include the default params, if they have been set\n const queryParams = { ...this.defaultOptions, ...options };\n\n const result = await this.apiClient.makeRequest({\n method: \"GET\",\n url: `/v1/users/${this.knock.userId}/feeds/${this.feedId}`,\n params: queryParams,\n });\n\n if (result.statusCode === \"error\") {\n setState((store) => store.setNetworkStatus(NetworkStatus.error));\n\n return {\n status: result.statusCode,\n data: result.error || result.body,\n };\n }\n\n const response = {\n entries: result.body.entries,\n meta: result.body.meta,\n page_info: result.body.page_info,\n };\n\n if (options.before) {\n const opts = { shouldSetPage: false, shouldAppend: true };\n setState((state) => state.setResult(response, opts));\n } else if (options.after) {\n const opts = { shouldSetPage: true, shouldAppend: true };\n setState((state) => state.setResult(response, opts));\n } else {\n setState((state) => state.setResult(response));\n }\n\n this.broadcast(\"messages.new\", response);\n return { data: response, status: result.statusCode };\n }\n\n async fetchNextPage() {\n // Attempts to fetch the next page of results (if we have any)\n const { getState } = this.store;\n const { pageInfo } = getState();\n\n if (!pageInfo.after) {\n // Nothing more to fetch\n return;\n }\n\n this.fetch({\n after: pageInfo.after,\n __loadingType: NetworkStatus.fetchMore,\n });\n }\n\n private broadcast(eventName: FeedRealTimeEvent, data: any) {\n this.broadcaster.emit(eventName, data);\n }\n\n // Invoked when a new real-time message comes in from the socket\n private async onNewMessageReceived({\n metadata,\n }: FeedMessagesReceivedPayload) {\n // Handle the new message coming in\n const { getState, setState } = this.store;\n const currentHead: FeedItem | undefined = getState().items[0];\n // Optimistically set the badge counts\n setState((state) => state.setMetadata(metadata));\n // Fetch the items before the current head (if it exists)\n this.fetch({ before: currentHead?.__cursor });\n }\n\n private buildUserFeedId() {\n return `${this.feedId}:${this.knock.userId}`;\n }\n\n private optimisticallyPerformStatusUpdate(\n itemOrItems: FeedItemOrItems,\n type: Status,\n attrs: object,\n badgeCountAttr?: \"unread_count\" | \"unseen_count\",\n ) {\n const { getState, setState } = this.store;\n const itemIds = Array.isArray(itemOrItems)\n ? itemOrItems.map((item) => item.id)\n : [itemOrItems.id];\n\n if (badgeCountAttr) {\n const { metadata } = getState();\n\n // Tnis is a hack to determine the direction of whether we're\n // adding or removing from the badge count\n const direction = type.startsWith(\"un\")\n ? itemIds.length\n : -itemIds.length;\n\n setState((store) =>\n store.setMetadata({\n ...metadata,\n [badgeCountAttr]: Math.max(0, metadata[badgeCountAttr] + direction),\n }),\n );\n }\n\n // Update the items with the given attributes\n setState((store) => store.setItemAttrs(itemIds, attrs));\n }\n\n private async makeStatusUpdate(itemOrItems: FeedItemOrItems, type: Status) {\n // If we're interacting with an array, then we want to send this as a batch\n if (Array.isArray(itemOrItems)) {\n const itemIds = itemOrItems.map((item) => item.id);\n\n return await this.apiClient.makeRequest({\n method: \"POST\",\n url: `/v1/messages/batch/${type}`,\n data: { message_ids: itemIds },\n });\n }\n\n // If its a single then we can just call the regular endpoint\n const result = await this.apiClient.makeRequest({\n method: type.startsWith(\"un\") ? \"DELETE\" : \"PUT\",\n url: `/v1/messages/${itemOrItems.id}/${type}`,\n });\n\n return result;\n }\n}\n\nexport default Feed;\n"],"file":"feed.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/clients/feed/feed.ts"],"names":["EventEmitter2","EventEmitter","createStore","isRequestInFlight","NetworkStatus","Feed","constructor","knock","feedId","options","apiClient","client","userFeedId","buildUserFeedId","store","broadcaster","wildcard","delimiter","defaultOptions","connectSocket","channel","createChannel","listenForUpdates","channelConnected","join","receive","on","resp","onNewMessageReceived","leave","e","console","error","eventName","callback","off","getState","markAsSeen","itemOrItems","now","Date","toISOString","optimisticallyPerformStatusUpdate","seen_at","makeStatusUpdate","markAsUnseen","markAsRead","read_at","markAsUnread","markAsArchived","setState","state","shouldRemoveItems","include_archived","normalizedItems","Array","isArray","itemIds","map","item","id","unseenCount","filter","i","length","unreadCount","meta","metadata","total_count","unseen_count","unread_count","entries","items","includes","setResult","page_info","pageInfo","setMetadata","setItemAttrs","archived_at","markAsUnarchived","fetch","networkStatus","setNetworkStatus","__loadingType","loading","queryParams","result","makeRequest","method","url","userId","params","statusCode","body","status","data","response","before","opts","shouldSetPage","shouldAppend","after","broadcast","feedEventType","__fetchSource","eventPayload","event","fetchNextPage","fetchMore","emit","currentHead","__cursor","type","attrs","badgeCountAttr","direction","startsWith","Math","max","message_ids"],"mappings":"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","sourcesContent":["import { Channel } from \"phoenix\";\nimport { StoreApi } from \"zustand\";\nimport { EventEmitter2 as EventEmitter } from \"eventemitter2\";\nimport ApiClient from \"../../api\";\nimport createStore from \"./store\";\nimport {\n BindableFeedEvent,\n FeedMessagesReceivedPayload,\n FeedEventCallback,\n FeedEvent,\n FeedItemOrItems,\n FeedStoreState,\n FeedEventPayload,\n FeedRealTimeCallback,\n} from \"./types\";\nimport {\n FeedItem,\n FeedClientOptions,\n FetchFeedOptions,\n FeedResponse,\n FeedMetadata,\n} from \"./interfaces\";\nimport Knock from \"../../knock\";\nimport { isRequestInFlight, NetworkStatus } from \"../../networkStatus\";\n\nexport type Status =\n | \"seen\"\n | \"read\"\n | \"archived\"\n | \"unseen\"\n | \"unread\"\n | \"unarchived\";\n\nclass Feed {\n private apiClient: ApiClient;\n private userFeedId: string;\n private channelConnected = false;\n private channel: Channel;\n private broadcaster: EventEmitter;\n private defaultOptions: FeedClientOptions;\n\n // The raw store instance, used for binding in React and other environments\n public store: StoreApi<FeedStoreState>;\n\n constructor(\n readonly knock: Knock,\n readonly feedId: string,\n options: FeedClientOptions,\n ) {\n this.apiClient = knock.client();\n this.feedId = feedId;\n this.userFeedId = this.buildUserFeedId();\n this.store = createStore();\n this.broadcaster = new EventEmitter({ wildcard: true, delimiter: \".\" });\n this.defaultOptions = options;\n\n // Try and connect to the socket\n this.apiClient.connectSocket();\n\n this.channel = this.apiClient.createChannel(\n `feeds:${this.userFeedId}`,\n this.defaultOptions,\n );\n }\n\n /*\n Returns a socket to listen for feed updates\n */\n listenForUpdates() {\n if (!this.channelConnected) {\n this.channel.join().receive(\"ok\", () => {\n this.channelConnected = true;\n });\n\n this.channel.on(\"new-message\", (resp) => this.onNewMessageReceived(resp));\n }\n\n return () => {\n try {\n this.channel.leave();\n } catch (e) {\n // tslint:disable-next-line\n console.error(\"error while leaving channel\", e);\n }\n };\n }\n\n /* Binds a handler to be invoked when event occurs */\n on(\n eventName: BindableFeedEvent,\n callback: FeedEventCallback | FeedRealTimeCallback,\n ) {\n this.broadcaster.on(eventName, callback);\n }\n\n off(\n eventName: BindableFeedEvent,\n callback: FeedEventCallback | FeedRealTimeCallback,\n ) {\n this.broadcaster.off(eventName, callback);\n }\n\n getState() {\n return this.store.getState();\n }\n\n async markAsSeen(itemOrItems: FeedItemOrItems) {\n const now = new Date().toISOString();\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"seen\",\n { seen_at: now },\n \"unseen_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"seen\");\n }\n\n async markAsUnseen(itemOrItems: FeedItemOrItems) {\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"unseen\",\n { seen_at: null },\n \"unseen_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"unseen\");\n }\n\n async markAsRead(itemOrItems: FeedItemOrItems) {\n const now = new Date().toISOString();\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"read\",\n { read_at: now },\n \"unread_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"read\");\n }\n\n async markAsUnread(itemOrItems: FeedItemOrItems) {\n this.optimisticallyPerformStatusUpdate(\n itemOrItems,\n \"unread\",\n { read_at: null },\n \"unread_count\",\n );\n return this.makeStatusUpdate(itemOrItems, \"unread\");\n }\n\n /*\n Marking one or more items as archived should:\n\n - Decrement the badge count for any unread / unseen items\n - Remove the item from the feed list, when the include_archived flag is not true)\n\n TODO: how do we handle rollbacks?\n */\n async markAsArchived(itemOrItems: FeedItemOrItems) {\n const { getState, setState } = this.store;\n const state = getState();\n const shouldRemoveItems = this.defaultOptions.include_archived !== true;\n\n const normalizedItems = Array.isArray(itemOrItems)\n ? itemOrItems\n : [itemOrItems];\n\n const itemIds: string[] = normalizedItems.map((item) => item.id);\n\n // If any of the items are unseen or unread, then capture as we'll want to decrement\n // the counts for these in the metadata we have\n const unseenCount = normalizedItems.filter((i) => !i.seen_at).length;\n const unreadCount = normalizedItems.filter((i) => !i.read_at).length;\n\n // Build the new metadata\n const meta = {\n ...state.metadata,\n total_count: state.metadata.total_count - normalizedItems.length,\n unseen_count: state.metadata.unseen_count - unseenCount,\n unread_count: state.metadata.unread_count - unreadCount,\n };\n\n // Perform optimistic updates on the items in the feed\n if (shouldRemoveItems) {\n // Filter the items out of the list\n const entries = state.items.filter((item) => !itemIds.includes(item.id));\n\n setState((state) =>\n state.setResult({ entries, meta, page_info: state.pageInfo }),\n );\n } else {\n setState((state) => {\n state.setMetadata(meta);\n state.setItemAttrs(itemIds, { archived_at: new Date().toISOString() });\n });\n }\n\n return this.makeStatusUpdate(itemOrItems, \"archived\");\n }\n\n async markAsUnarchived(itemOrItems: FeedItemOrItems) {\n this.optimisticallyPerformStatusUpdate(itemOrItems, \"unarchived\", {\n archived_at: null,\n });\n return this.makeStatusUpdate(itemOrItems, \"unarchived\");\n }\n\n /* Fetches the feed content, appending it to the store */\n async fetch(options: FetchFeedOptions = {}) {\n const { setState, getState } = this.store;\n const { networkStatus } = getState();\n\n // If there's an existing request in flight, then do nothing\n if (isRequestInFlight(networkStatus)) {\n return;\n }\n\n // Set the loading type based on the request type it is\n setState((store) =>\n store.setNetworkStatus(options.__loadingType ?? NetworkStatus.loading),\n );\n\n // Always include the default params, if they have been set\n const queryParams = { ...this.defaultOptions, ...options };\n\n const result = await this.apiClient.makeRequest({\n method: \"GET\",\n url: `/v1/users/${this.knock.userId}/feeds/${this.feedId}`,\n params: queryParams,\n });\n\n if (result.statusCode === \"error\" || !result.body) {\n setState((store) => store.setNetworkStatus(NetworkStatus.error));\n\n return {\n status: result.statusCode,\n data: result.error || result.body,\n };\n }\n\n const response = {\n entries: result.body.entries,\n meta: result.body.meta,\n page_info: result.body.page_info,\n };\n\n if (options.before) {\n const opts = { shouldSetPage: false, shouldAppend: true };\n setState((state) => state.setResult(response, opts));\n } else if (options.after) {\n const opts = { shouldSetPage: true, shouldAppend: true };\n setState((state) => state.setResult(response, opts));\n } else {\n setState((state) => state.setResult(response));\n }\n\n // Legacy `messages.new` event, should be removed in a future version\n this.broadcast(\"messages.new\", response);\n\n // Broadcast the appropriate event type depending on the fetch source\n const feedEventType: FeedEvent =\n options.__fetchSource === \"socket\"\n ? \"items.received.realtime\"\n : \"items.received.page\";\n\n const eventPayload = {\n items: response.entries as FeedItem[],\n metadata: response.meta as FeedMetadata,\n event: feedEventType,\n };\n\n this.broadcast(eventPayload.event, eventPayload);\n\n return { data: response, status: result.statusCode };\n }\n\n async fetchNextPage() {\n // Attempts to fetch the next page of results (if we have any)\n const { getState } = this.store;\n const { pageInfo } = getState();\n\n if (!pageInfo.after) {\n // Nothing more to fetch\n return;\n }\n\n this.fetch({\n after: pageInfo.after,\n __loadingType: NetworkStatus.fetchMore,\n });\n }\n\n private broadcast(\n eventName: FeedEvent,\n data: FeedResponse | FeedEventPayload,\n ) {\n this.broadcaster.emit(eventName, data);\n }\n\n // Invoked when a new real-time message comes in from the socket\n private async onNewMessageReceived({\n metadata,\n }: FeedMessagesReceivedPayload) {\n // Handle the new message coming in\n const { getState, setState } = this.store;\n const { items } = getState();\n const currentHead: FeedItem | undefined = items[0];\n // Optimistically set the badge counts\n setState((state) => state.setMetadata(metadata));\n // Fetch the items before the current head (if it exists)\n this.fetch({ before: currentHead?.__cursor, __fetchSource: \"socket\" });\n }\n\n private buildUserFeedId() {\n return `${this.feedId}:${this.knock.userId}`;\n }\n\n private optimisticallyPerformStatusUpdate(\n itemOrItems: FeedItemOrItems,\n type: Status,\n attrs: object,\n badgeCountAttr?: \"unread_count\" | \"unseen_count\",\n ) {\n const { getState, setState } = this.store;\n const itemIds = Array.isArray(itemOrItems)\n ? itemOrItems.map((item) => item.id)\n : [itemOrItems.id];\n\n if (badgeCountAttr) {\n const { metadata } = getState();\n\n // Tnis is a hack to determine the direction of whether we're\n // adding or removing from the badge count\n const direction = type.startsWith(\"un\")\n ? itemIds.length\n : -itemIds.length;\n\n setState((store) =>\n store.setMetadata({\n ...metadata,\n [badgeCountAttr]: Math.max(0, metadata[badgeCountAttr] + direction),\n }),\n );\n }\n\n // Update the items with the given attributes\n setState((store) => store.setItemAttrs(itemIds, attrs));\n }\n\n private async makeStatusUpdate(itemOrItems: FeedItemOrItems, type: Status) {\n // If we're interacting with an array, then we want to send this as a batch\n if (Array.isArray(itemOrItems)) {\n const itemIds = itemOrItems.map((item) => item.id);\n\n return await this.apiClient.makeRequest({\n method: \"POST\",\n url: `/v1/messages/batch/${type}`,\n data: { message_ids: itemIds },\n });\n }\n\n // If its a single then we can just call the regular endpoint\n const result = await this.apiClient.makeRequest({\n method: type.startsWith(\"un\") ? \"DELETE\" : \"PUT\",\n url: `/v1/messages/${itemOrItems.id}/${type}`,\n });\n\n return result;\n }\n}\n\nexport default Feed;\n"],"file":"feed.js"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
export {};
|
|
2
2
|
//# sourceMappingURL=interfaces.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
2
|
|
|
3
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
|
3
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
4
4
|
|
|
5
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
|
5
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
6
6
|
|
|
7
7
|
import create from "zustand/vanilla";
|
|
8
8
|
import { NetworkStatus } from "../../networkStatus";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/clients/feed/store.ts"],"names":["create","NetworkStatus","deduplicateItems","sortItems","processItems","items","deduped","sorted","defaultSetResultOptions","shouldSetPage","shouldAppend","createStore","set","networkStatus","ready","loading","metadata","total_count","unread_count","unseen_count","pageInfo","before","after","page_size","setLoading","setNetworkStatus","setResult","entries","meta","page_info","options","state","concat","setMetadata","setItemAttrs","itemIds","attrs","itemUpdatesMap","reduce","acc","itemId","map","item","id"],"mappings":";;;;;;AAAA,OAAOA,MAAP,MAAmB,iBAAnB;AACA,SAASC,aAAT,QAA8B,qBAA9B;AAGA,SAASC,gBAAT,EAA2BC,SAA3B,QAA4C,SAA5C;;AAEA,SAASC,YAAT,CAAsBC,KAAtB,EAAyC;AACvC,MAAMC,OAAO,GAAGJ,gBAAgB,CAACG,KAAD,CAAhC;AACA,MAAME,MAAM,GAAGJ,SAAS,CAACG,OAAD,CAAxB;AAEA,SAAOC,MAAP;AACD;;AAED,IAAMC,uBAAuB,GAAG;AAC9BC,EAAAA,aAAa,EAAE,IADe;AAE9BC,EAAAA,YAAY,EAAE;AAFgB,CAAhC;AAKA,eAAe,SAASC,WAAT,GAAuB;AACpC,SAAOX,MAAM,CAAkBY,GAAD,KAAU;AACtC;AACAP,IAAAA,KAAK,EAAE,EAF+B;AAItC;AACAQ,IAAAA,aAAa,EAAEZ,aAAa,CAACa,KALS;AAMtCC,IAAAA,OAAO,EAAE,KAN6B;AAQtC;AACAC,IAAAA,QAAQ,EAAE;AACRC,MAAAA,WAAW,EAAE,CADL;AAERC,MAAAA,YAAY,EAAE,CAFN;AAGRC,MAAAA,YAAY,EAAE;AAHN,KAT4B;AAetC;AACAC,IAAAA,QAAQ,EAAE;AACRC,MAAAA,MAAM,EAAE,IADA;AAERC,MAAAA,KAAK,EAAE,IAFC;AAGRC,MAAAA,SAAS,EAAE;AAHH,KAhB4B;AAsBtC;AACA;AACAC,IAAAA,UAAU,EAAGT,OAAD,IAAaH,GAAG,CAAC,OAAO;AAAEG,MAAAA;AAAF,KAAP,CAAD,CAxBU;AA0BtCU,IAAAA,gBAAgB,EAAGZ,aAAD,IAChBD,GAAG,CAAC,OAAO;AACTC,MAAAA,aADS;AAETE,MAAAA,OAAO,EAAEF,aAAa,KAAKZ,aAAa,CAACc;AAFhC,KAAP,CAAD,CA3BiC;AAgCtCW,IAAAA,SAAS,EAAE;AAAA,UACT;AAAEC,QAAAA,OAAF;AAAWC,QAAAA,IAAX;AAAiBC,QAAAA;AAAjB,OADS;AAAA,UAETC,OAFS,uEAECtB,uBAFD;AAAA,aAITI,GAAG,CAAEmB,KAAD,IAAW;AACb;AACA,YAAM1B,KAAK,GAAGyB,OAAO,CAACpB,YAAR,GACVN,YAAY,CAAC2B,KAAK,CAAC1B,KAAN,CAAY2B,MAAZ,CAAmBL,OAAnB,CAAD,CADF,GAEVA,OAFJ;AAIA,eAAO;AACLtB,UAAAA,KADK;AAELW,UAAAA,QAAQ,EAAEY,IAFL;AAGLR,UAAAA,QAAQ,EAAEU,OAAO,CAACrB,aAAR,GAAwBoB,SAAxB,GAAoCE,KAAK,CAACX,QAH/C;AAILL,UAAAA,OAAO,EAAE,KAJJ;AAKLF,UAAAA,aAAa,EAAEZ,aAAa,CAACa;AALxB,SAAP;AAOD,OAbE,CAJM;AAAA,KAhC2B;AAmDtCmB,IAAAA,WAAW,EAAGjB,QAAD,IAAcJ,GAAG,CAAC,OAAO;AAAEI,MAAAA;AAAF,KAAP,CAAD,CAnDQ;
|
|
1
|
+
{"version":3,"sources":["../../../../src/clients/feed/store.ts"],"names":["create","NetworkStatus","deduplicateItems","sortItems","processItems","items","deduped","sorted","defaultSetResultOptions","shouldSetPage","shouldAppend","createStore","set","networkStatus","ready","loading","metadata","total_count","unread_count","unseen_count","pageInfo","before","after","page_size","setLoading","setNetworkStatus","setResult","entries","meta","page_info","options","state","concat","setMetadata","setItemAttrs","itemIds","attrs","itemUpdatesMap","reduce","acc","itemId","map","item","id"],"mappings":";;;;;;AAAA,OAAOA,MAAP,MAAmB,iBAAnB;AACA,SAASC,aAAT,QAA8B,qBAA9B;AAGA,SAASC,gBAAT,EAA2BC,SAA3B,QAA4C,SAA5C;;AAEA,SAASC,YAAT,CAAsBC,KAAtB,EAAyC;AACvC,MAAMC,OAAO,GAAGJ,gBAAgB,CAACG,KAAD,CAAhC;AACA,MAAME,MAAM,GAAGJ,SAAS,CAACG,OAAD,CAAxB;AAEA,SAAOC,MAAP;AACD;;AAED,IAAMC,uBAAuB,GAAG;AAC9BC,EAAAA,aAAa,EAAE,IADe;AAE9BC,EAAAA,YAAY,EAAE;AAFgB,CAAhC;AAKA,eAAe,SAASC,WAAT,GAAuB;AACpC,SAAOX,MAAM,CAAkBY,GAAD,KAAU;AACtC;AACAP,IAAAA,KAAK,EAAE,EAF+B;AAItC;AACAQ,IAAAA,aAAa,EAAEZ,aAAa,CAACa,KALS;AAMtCC,IAAAA,OAAO,EAAE,KAN6B;AAQtC;AACAC,IAAAA,QAAQ,EAAE;AACRC,MAAAA,WAAW,EAAE,CADL;AAERC,MAAAA,YAAY,EAAE,CAFN;AAGRC,MAAAA,YAAY,EAAE;AAHN,KAT4B;AAetC;AACAC,IAAAA,QAAQ,EAAE;AACRC,MAAAA,MAAM,EAAE,IADA;AAERC,MAAAA,KAAK,EAAE,IAFC;AAGRC,MAAAA,SAAS,EAAE;AAHH,KAhB4B;AAsBtC;AACA;AACAC,IAAAA,UAAU,EAAGT,OAAD,IAAaH,GAAG,CAAC,OAAO;AAAEG,MAAAA;AAAF,KAAP,CAAD,CAxBU;AA0BtCU,IAAAA,gBAAgB,EAAGZ,aAAD,IAChBD,GAAG,CAAC,OAAO;AACTC,MAAAA,aADS;AAETE,MAAAA,OAAO,EAAEF,aAAa,KAAKZ,aAAa,CAACc;AAFhC,KAAP,CAAD,CA3BiC;AAgCtCW,IAAAA,SAAS,EAAE;AAAA,UACT;AAAEC,QAAAA,OAAF;AAAWC,QAAAA,IAAX;AAAiBC,QAAAA;AAAjB,OADS;AAAA,UAETC,OAFS,uEAECtB,uBAFD;AAAA,aAITI,GAAG,CAAEmB,KAAD,IAAW;AACb;AACA,YAAM1B,KAAK,GAAGyB,OAAO,CAACpB,YAAR,GACVN,YAAY,CAAC2B,KAAK,CAAC1B,KAAN,CAAY2B,MAAZ,CAAmBL,OAAnB,CAAD,CADF,GAEVA,OAFJ;AAIA,eAAO;AACLtB,UAAAA,KADK;AAELW,UAAAA,QAAQ,EAAEY,IAFL;AAGLR,UAAAA,QAAQ,EAAEU,OAAO,CAACrB,aAAR,GAAwBoB,SAAxB,GAAoCE,KAAK,CAACX,QAH/C;AAILL,UAAAA,OAAO,EAAE,KAJJ;AAKLF,UAAAA,aAAa,EAAEZ,aAAa,CAACa;AALxB,SAAP;AAOD,OAbE,CAJM;AAAA,KAhC2B;AAmDtCmB,IAAAA,WAAW,EAAGjB,QAAD,IAAcJ,GAAG,CAAC,OAAO;AAAEI,MAAAA;AAAF,KAAP,CAAD,CAnDQ;AAqDtCkB,IAAAA,YAAY,EAAE,CAACC,OAAD,EAAUC,KAAV,KAAoB;AAChC;AACA,UAAMC,cAAwC,GAAGF,OAAO,CAACG,MAAR,CAC/C,CAACC,GAAD,EAAMC,MAAN,qCAAuBD,GAAvB;AAA4B,SAACC,MAAD,GAAUJ;AAAtC,QAD+C,EAE/C,EAF+C,CAAjD;AAKA,aAAOxB,GAAG,CAAEmB,KAAD,IAAW;AACpB,YAAM1B,KAAK,GAAG0B,KAAK,CAAC1B,KAAN,CAAYoC,GAAZ,CAAiBC,IAAD,IAAU;AACtC,cAAIL,cAAc,CAACK,IAAI,CAACC,EAAN,CAAlB,EAA6B;AAC3B,mDAAYD,IAAZ,GAAqBL,cAAc,CAACK,IAAI,CAACC,EAAN,CAAnC;AACD;;AAED,iBAAOD,IAAP;AACD,SANa,CAAd;AAQA,eAAO;AAAErC,UAAAA;AAAF,SAAP;AACD,OAVS,CAAV;AAWD;AAvEqC,GAAV,CAAjB,CAAb;AAyED","sourcesContent":["import create from \"zustand/vanilla\";\nimport { NetworkStatus } from \"../../networkStatus\";\nimport { FeedItem } from \"./interfaces\";\nimport { FeedStoreState } from \"./types\";\nimport { deduplicateItems, sortItems } from \"./utils\";\n\nfunction processItems(items: FeedItem[]) {\n const deduped = deduplicateItems(items);\n const sorted = sortItems(deduped);\n\n return sorted;\n}\n\nconst defaultSetResultOptions = {\n shouldSetPage: true,\n shouldAppend: false,\n};\n\nexport default function createStore() {\n return create<FeedStoreState>((set) => ({\n // Keeps track of all of the items loaded\n items: [],\n\n // The network status indicates what's happening with the request\n networkStatus: NetworkStatus.ready,\n loading: false,\n\n // Keeps track of the current badge counts\n metadata: {\n total_count: 0,\n unread_count: 0,\n unseen_count: 0,\n },\n\n // Keeps track of the last full page of results we received (for paginating)\n pageInfo: {\n before: null,\n after: null,\n page_size: 50,\n },\n\n // TODO: remove this function from the store as we're now using the\n // `setNetworkStatus` function to derive this information instead\n setLoading: (loading) => set(() => ({ loading })),\n\n setNetworkStatus: (networkStatus: NetworkStatus) =>\n set(() => ({\n networkStatus,\n loading: networkStatus === NetworkStatus.loading,\n })),\n\n setResult: (\n { entries, meta, page_info },\n options = defaultSetResultOptions,\n ) =>\n set((state) => {\n // We resort the list on set, so concating everything is fine (if a bit suboptimal)\n const items = options.shouldAppend\n ? processItems(state.items.concat(entries))\n : entries;\n\n return {\n items,\n metadata: meta,\n pageInfo: options.shouldSetPage ? page_info : state.pageInfo,\n loading: false,\n networkStatus: NetworkStatus.ready,\n };\n }),\n\n setMetadata: (metadata) => set(() => ({ metadata })),\n\n setItemAttrs: (itemIds, attrs) => {\n // Create a map for the items to the updates to be made\n const itemUpdatesMap: { [id: string]: object } = itemIds.reduce(\n (acc, itemId) => ({ ...acc, [itemId]: attrs }),\n {},\n );\n\n return set((state) => {\n const items = state.items.map((item) => {\n if (itemUpdatesMap[item.id]) {\n return { ...item, ...itemUpdatesMap[item.id] };\n }\n\n return item;\n });\n\n return { items };\n });\n },\n }));\n}\n"],"file":"store.js"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
export {};
|
|
2
2
|
//# sourceMappingURL=types.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
export {};
|
|
2
2
|
//# sourceMappingURL=interfaces.js.map
|
package/dist/esm/interfaces.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
export {};
|
|
2
2
|
//# sourceMappingURL=interfaces.js.map
|
package/dist/types/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA,OAAc,EAAiB,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAKjE,aAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,CAAC;AAEF,MAAM,WAAW,WAAW;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA,OAAc,EAAiB,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAKjE,aAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,CAAC;AAEF,MAAM,WAAW,WAAW;IAE1B,KAAK,CAAC,EAAE,GAAG,CAAC;IAEZ,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,SAAS;IACb,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,MAAM,CAAS;IAChB,eAAe,UAAS;gBAEnB,OAAO,EAAE,gBAAgB;IA8BrC,aAAa;IAWb,gBAAgB;IAKhB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAIrC,WAAW,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IAwBhE,OAAO,CAAC,eAAe;CAuBxB;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { StoreApi } from "zustand";
|
|
2
|
-
import {
|
|
2
|
+
import { BindableFeedEvent, FeedEventCallback, FeedItemOrItems, FeedStoreState, FeedRealTimeCallback } from "./types";
|
|
3
3
|
import { FeedClientOptions, FetchFeedOptions } from "./interfaces";
|
|
4
4
|
import Knock from "../../knock";
|
|
5
5
|
export declare type Status = "seen" | "read" | "archived" | "unseen" | "unread" | "unarchived";
|
|
@@ -15,8 +15,8 @@ declare class Feed {
|
|
|
15
15
|
store: StoreApi<FeedStoreState>;
|
|
16
16
|
constructor(knock: Knock, feedId: string, options: FeedClientOptions);
|
|
17
17
|
listenForUpdates(): () => void;
|
|
18
|
-
on(eventName:
|
|
19
|
-
off(eventName:
|
|
18
|
+
on(eventName: BindableFeedEvent, callback: FeedEventCallback | FeedRealTimeCallback): void;
|
|
19
|
+
off(eventName: BindableFeedEvent, callback: FeedEventCallback | FeedRealTimeCallback): void;
|
|
20
20
|
getState(): FeedStoreState;
|
|
21
21
|
markAsSeen(itemOrItems: FeedItemOrItems): Promise<import("../../api").ApiResponse>;
|
|
22
22
|
markAsUnseen(itemOrItems: FeedItemOrItems): Promise<import("../../api").ApiResponse>;
|
|
@@ -25,15 +25,8 @@ declare class Feed {
|
|
|
25
25
|
markAsArchived(itemOrItems: FeedItemOrItems): Promise<import("../../api").ApiResponse>;
|
|
26
26
|
markAsUnarchived(itemOrItems: FeedItemOrItems): Promise<import("../../api").ApiResponse>;
|
|
27
27
|
fetch(options?: FetchFeedOptions): Promise<{
|
|
28
|
-
status: "error";
|
|
28
|
+
status: "ok" | "error";
|
|
29
29
|
data: any;
|
|
30
|
-
} | {
|
|
31
|
-
data: {
|
|
32
|
-
entries: any;
|
|
33
|
-
meta: any;
|
|
34
|
-
page_info: any;
|
|
35
|
-
};
|
|
36
|
-
status: "ok";
|
|
37
30
|
} | undefined>;
|
|
38
31
|
fetchNextPage(): Promise<void>;
|
|
39
32
|
private broadcast;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../../../src/clients/feed/feed.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAInC,OAAO,
|
|
1
|
+
{"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../../../src/clients/feed/feed.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAInC,OAAO,EACL,iBAAiB,EAEjB,iBAAiB,EAEjB,eAAe,EACf,cAAc,EAEd,oBAAoB,EACrB,MAAM,SAAS,CAAC;AACjB,OAAO,EAEL,iBAAiB,EACjB,gBAAgB,EAGjB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,MAAM,aAAa,CAAC;AAGhC,oBAAY,MAAM,GACd,MAAM,GACN,MAAM,GACN,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,YAAY,CAAC;AAEjB,cAAM,IAAI;IAYN,QAAQ,CAAC,KAAK,EAAE,KAAK;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAZzB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,cAAc,CAAoB;IAGnC,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;gBAG5B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACvB,OAAO,EAAE,iBAAiB;IAqB5B,gBAAgB;IAoBhB,EAAE,CACA,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB;IAKpD,GAAG,CACD,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB;IAKpD,QAAQ;IAIF,UAAU,CAAC,WAAW,EAAE,eAAe;IAWvC,YAAY,CAAC,WAAW,EAAE,eAAe;IAUzC,UAAU,CAAC,WAAW,EAAE,eAAe;IAWvC,YAAY,CAAC,WAAW,EAAE,eAAe;IAkBzC,cAAc,CAAC,WAAW,EAAE,eAAe;IA0C3C,gBAAgB,CAAC,WAAW,EAAE,eAAe;IAQ7C,KAAK,CAAC,OAAO,GAAE,gBAAqB;;;;IAoEpC,aAAa;IAgBnB,OAAO,CAAC,SAAS;YAQH,oBAAoB;IAalC,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iCAAiC;YAgC3B,gBAAgB;CAoB/B;AAED,eAAe,IAAI,CAAC"}
|
|
@@ -11,6 +11,7 @@ export interface FeedClientOptions {
|
|
|
11
11
|
}
|
|
12
12
|
export declare type FetchFeedOptions = {
|
|
13
13
|
__loadingType?: NetworkStatus.loading | NetworkStatus.fetchMore;
|
|
14
|
+
__fetchSource?: "socket" | "http";
|
|
14
15
|
} & FeedClientOptions;
|
|
15
16
|
export interface ContentBlock {
|
|
16
17
|
content: string;
|
|
@@ -22,7 +23,7 @@ export interface NotificationSource {
|
|
|
22
23
|
key: string;
|
|
23
24
|
version_id: string;
|
|
24
25
|
}
|
|
25
|
-
export interface FeedItem {
|
|
26
|
+
export interface FeedItem<T = GenericData> {
|
|
26
27
|
__cursor: string;
|
|
27
28
|
id: string;
|
|
28
29
|
activities: Activity[];
|
|
@@ -32,9 +33,10 @@ export interface FeedItem {
|
|
|
32
33
|
updated_at: string;
|
|
33
34
|
read_at: string | null;
|
|
34
35
|
seen_at: string | null;
|
|
36
|
+
archived_at: string | null;
|
|
35
37
|
total_activities: number;
|
|
36
38
|
total_actors: number;
|
|
37
|
-
data:
|
|
39
|
+
data: T | null;
|
|
38
40
|
source: NotificationSource;
|
|
39
41
|
}
|
|
40
42
|
export interface FeedMetadata {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../src/clients/feed/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;IAErC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,oBAAY,gBAAgB,GAAG;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAC,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../src/clients/feed/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;IAErC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,oBAAY,gBAAgB,GAAG;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAC,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC;IAChE,aAAa,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CACnC,GAAG,iBAAiB,CAAC;AAEtB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,WAAW;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,MAAM,EAAE,IAAI,EAAE,CAAC;IACf,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,QAAQ,CAAC;CACrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../src/clients/feed/store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAezC,MAAM,CAAC,OAAO,UAAU,WAAW,
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../src/clients/feed/store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAezC,MAAM,CAAC,OAAO,UAAU,WAAW,uDA0ElC"}
|
|
@@ -21,5 +21,14 @@ export declare type FeedMessagesReceivedPayload = {
|
|
|
21
21
|
metadata: FeedMetadata;
|
|
22
22
|
};
|
|
23
23
|
export declare type FeedRealTimeEvent = "messages.new";
|
|
24
|
+
export declare type FeedEvent = FeedRealTimeEvent | "items.received.page" | "items.received.realtime";
|
|
25
|
+
export declare type BindableFeedEvent = FeedEvent | "items.received.*";
|
|
26
|
+
export declare type FeedEventPayload = {
|
|
27
|
+
event: Omit<FeedEvent, "messages.new">;
|
|
28
|
+
items: FeedItem[];
|
|
29
|
+
metadata: FeedMetadata;
|
|
30
|
+
};
|
|
31
|
+
export declare type FeedRealTimeCallback = (resp: FeedResponse) => void;
|
|
32
|
+
export declare type FeedEventCallback = (payload: FeedEventPayload) => void;
|
|
24
33
|
export declare type FeedItemOrItems = FeedItem | FeedItem[];
|
|
25
34
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/clients/feed/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEpE,oBAAY,sBAAsB,GAAG;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,oBAAY,cAAc,GAAG;IAC3B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAC3E,WAAW,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9C,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,gBAAgB,EAAE,CAAC,aAAa,EAAE,aAAa,KAAK,IAAI,CAAC;IACzD,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1D,CAAC;AAEF,oBAAY,2BAA2B,GAAG;IACxC,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/clients/feed/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEpE,oBAAY,sBAAsB,GAAG;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,oBAAY,cAAc,GAAG;IAC3B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAC3E,WAAW,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9C,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,gBAAgB,EAAE,CAAC,aAAa,EAAE,aAAa,KAAK,IAAI,CAAC;IACzD,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1D,CAAC;AAEF,oBAAY,2BAA2B,GAAG;IACxC,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC;AAQF,oBAAY,iBAAiB,GAAG,cAAc,CAAC;AAE/C,oBAAY,SAAS,GACjB,iBAAiB,GACjB,qBAAqB,GACrB,yBAAyB,CAAC;AAG9B,oBAAY,iBAAiB,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAE/D,oBAAY,gBAAgB,GAAG;IAC7B,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACvC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF,oBAAY,oBAAoB,GAAG,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;AAEhE,oBAAY,iBAAiB,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAEpE,oBAAY,eAAe,GAAG,QAAQ,GAAG,QAAQ,EAAE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { FeedItem } from "./interfaces";
|
|
2
2
|
export declare function deduplicateItems(items: FeedItem[]): FeedItem[];
|
|
3
|
-
export declare function sortItems(items: FeedItem[]): FeedItem[];
|
|
3
|
+
export declare function sortItems(items: FeedItem[]): FeedItem<import("../..").GenericData>[];
|
|
4
4
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/clients/feed/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAY9D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/clients/feed/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAY9D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,2CAM1C"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
export declare type ChannelType = "email" | "in_app_feed";
|
|
1
|
+
export declare type ChannelType = "email" | "in_app_feed" | "sms" | "push" | "chat";
|
|
2
2
|
export declare type ChannelTypePreferences = {
|
|
3
|
-
|
|
4
|
-
in_app_feed: boolean;
|
|
3
|
+
[K in ChannelType]: boolean;
|
|
5
4
|
};
|
|
6
5
|
export declare type WorkflowPreferenceSetting = boolean | {
|
|
7
6
|
channel_types: ChannelTypePreferences;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../src/clients/preferences/interfaces.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../src/clients/preferences/interfaces.ts"],"names":[],"mappings":"AAEA,oBAAY,WAAW,GAAG,OAAO,GAAG,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5E,oBAAY,sBAAsB,GAAG;KAClC,CAAC,IAAI,WAAW,GAAG,OAAO;CAC5B,CAAC;AAEF,oBAAY,yBAAyB,GACjC,OAAO,GACP;IAAE,aAAa,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,yBAAyB,CAAC;CAC1C;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,mBAAmB,CAAC;IAC/B,UAAU,EAAE,mBAAmB,CAAC;IAChC,aAAa,EAAE,sBAAsB,CAAC;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,mBAAmB,CAAC;IAChC,SAAS,EAAE,mBAAmB,CAAC;IAC/B,aAAa,EAAE,sBAAsB,CAAC;CACvC;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
export interface KnockOptions {
|
|
2
2
|
host?: string;
|
|
3
3
|
}
|
|
4
|
-
export
|
|
5
|
-
[
|
|
4
|
+
export declare type GenericData = {
|
|
5
|
+
[x: string]: any;
|
|
6
|
+
};
|
|
7
|
+
export interface KnockObject<T = GenericData> {
|
|
8
|
+
id: string;
|
|
9
|
+
collection: string;
|
|
10
|
+
properties: T;
|
|
11
|
+
updated_at: string;
|
|
12
|
+
created_at: string | null;
|
|
6
13
|
}
|
|
7
14
|
export interface User extends GenericData {
|
|
8
15
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,oBAAY,WAAW,GAAG;IAExB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAClB,CAAC;AAEF,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,WAAW;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,CAAC,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,IAAI,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC;CACnB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@knocklabs/client",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.6",
|
|
4
4
|
"description": "The clientside library for interacting with Knock",
|
|
5
5
|
"homepage": "https://github.com/knocklabs/knock-client-js",
|
|
6
6
|
"author": "@knocklabs",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"url": "https://github.com/knocklabs/knock-client-js/issues"
|
|
28
28
|
},
|
|
29
29
|
"scripts": {
|
|
30
|
-
"lint": "
|
|
30
|
+
"lint": "eslint \"src/**/*.+(ts|js|tsx)\"",
|
|
31
31
|
"prettier": "prettier \"src/**/*.{js,ts,tsx}\" --check",
|
|
32
32
|
"format": "prettier \"src/**/*.{js,ts,tsx}\" --write",
|
|
33
33
|
"clean": "rimraf dist",
|
|
@@ -41,26 +41,28 @@
|
|
|
41
41
|
"prepublishOnly": "npm run build"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@babel/cli": "^7.
|
|
45
|
-
"@babel/core": "^7.
|
|
46
|
-
"@babel/plugin-proposal-class-properties": "^7.
|
|
47
|
-
"@babel/plugin-proposal-object-rest-spread": "^7.
|
|
48
|
-
"@babel/plugin-transform-runtime": "^7.
|
|
49
|
-
"@babel/preset-env": "^7.
|
|
50
|
-
"@babel/preset-typescript": "^7.
|
|
44
|
+
"@babel/cli": "^7.16.7",
|
|
45
|
+
"@babel/core": "^7.16.7",
|
|
46
|
+
"@babel/plugin-proposal-class-properties": "^7.16.7",
|
|
47
|
+
"@babel/plugin-proposal-object-rest-spread": "^7.16.7",
|
|
48
|
+
"@babel/plugin-transform-runtime": "^7.16.7",
|
|
49
|
+
"@babel/preset-env": "^7.16.7",
|
|
50
|
+
"@babel/preset-typescript": "^7.16.7",
|
|
51
51
|
"@types/phoenix": "^1.5.1",
|
|
52
|
+
"@typescript-eslint/eslint-plugin": "^5.4.0",
|
|
53
|
+
"@typescript-eslint/parser": "^5.4.0",
|
|
52
54
|
"cross-env": "^7.0.3",
|
|
55
|
+
"eslint": "7.23.0",
|
|
53
56
|
"prettier": "^2.2.1",
|
|
54
57
|
"rimraf": "^3.0.2",
|
|
55
58
|
"rollup": "^2.46.0",
|
|
56
|
-
"tslint": "^6.1.3",
|
|
57
59
|
"typescript": "^4.2.4"
|
|
58
60
|
},
|
|
59
61
|
"dependencies": {
|
|
60
62
|
"axios": "^0.21.4",
|
|
61
63
|
"axios-retry": "^3.1.9",
|
|
62
|
-
"
|
|
63
|
-
"phoenix": "
|
|
64
|
+
"eventemitter2": "^6.4.5",
|
|
65
|
+
"phoenix": "1.5.8",
|
|
64
66
|
"zustand": "^3.5.10"
|
|
65
67
|
}
|
|
66
68
|
}
|