@knocklabs/client 0.4.5-rc.1 → 0.4.5-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -207,22 +207,68 @@ var Feed = /*#__PURE__*/function () {
207
207
 
208
208
  return markAsUnread;
209
209
  }()
210
+ /*
211
+ Marking one or more items as archived should:
212
+ - Decrement the badge count for any unread / unseen items
213
+ - Remove the item from the feed list, when the include_archived flag is not true)
214
+ TODO: how do we handle rollbacks?
215
+ */
216
+
210
217
  }, {
211
218
  key: "markAsArchived",
212
219
  value: function () {
213
220
  var _markAsArchived = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(itemOrItems) {
214
- var now;
221
+ var _this$store, getState, setState, state, shouldRemoveItems, normalizedItems, itemIds, unseenCount, unreadCount, meta, entries;
222
+
215
223
  return _regenerator["default"].wrap(function _callee5$(_context5) {
216
224
  while (1) {
217
225
  switch (_context5.prev = _context5.next) {
218
226
  case 0:
219
- now = new Date().toISOString();
220
- this.optimisticallyPerformStatusUpdate(itemOrItems, "archived", {
221
- archived_at: now
222
- });
227
+ _this$store = this.store, getState = _this$store.getState, setState = _this$store.setState;
228
+ state = getState();
229
+ shouldRemoveItems = this.defaultOptions.include_archived !== true;
230
+ normalizedItems = Array.isArray(itemOrItems) ? itemOrItems : [itemOrItems];
231
+ itemIds = normalizedItems.map(function (item) {
232
+ return item.id;
233
+ }); // If any of the items are unseen or unread, then capture as we'll want to decrement
234
+ // the counts for these in the metadata we have
235
+
236
+ unseenCount = normalizedItems.filter(function (i) {
237
+ return !i.seen_at;
238
+ }).length;
239
+ unreadCount = normalizedItems.filter(function (i) {
240
+ return !i.read_at;
241
+ }).length; // Build the new metadata
242
+
243
+ meta = _objectSpread(_objectSpread({}, state.metadata), {}, {
244
+ unseen_count: state.metadata.unseen_count - unseenCount,
245
+ unread_count: state.metadata.unread_count - unreadCount
246
+ }); // Perform optimistic updates on the items in the feed
247
+
248
+ if (shouldRemoveItems) {
249
+ // Filter the items out of the list
250
+ entries = state.items.filter(function (item) {
251
+ return !itemIds.includes(item.id);
252
+ });
253
+ setState(function (state) {
254
+ return state.setResult({
255
+ entries: entries,
256
+ meta: meta,
257
+ page_info: state.pageInfo
258
+ });
259
+ });
260
+ } else {
261
+ setState(function (state) {
262
+ state.setMetadata(meta);
263
+ state.setItemAttrs(itemIds, {
264
+ archived_at: new Date().toISOString()
265
+ });
266
+ });
267
+ }
268
+
223
269
  return _context5.abrupt("return", this.makeStatusUpdate(itemOrItems, "archived"));
224
270
 
225
- case 3:
271
+ case 10:
226
272
  case "end":
227
273
  return _context5.stop();
228
274
  }
@@ -270,7 +316,7 @@ var Feed = /*#__PURE__*/function () {
270
316
  value: function () {
271
317
  var _fetch = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
272
318
  var options,
273
- _this$store,
319
+ _this$store2,
274
320
  setState,
275
321
  getState,
276
322
  _getState,
@@ -287,7 +333,7 @@ var Feed = /*#__PURE__*/function () {
287
333
  switch (_context7.prev = _context7.next) {
288
334
  case 0:
289
335
  options = _args7.length > 0 && _args7[0] !== undefined ? _args7[0] : {};
290
- _this$store = this.store, setState = _this$store.setState, getState = _this$store.getState;
336
+ _this$store2 = this.store, setState = _this$store2.setState, getState = _this$store2.getState;
291
337
  _getState = getState(), networkStatus = _getState.networkStatus; // If there's an existing request in flight, then do nothing
292
338
 
293
339
  if (!(0, _networkStatus.isRequestInFlight)(networkStatus)) {
@@ -429,7 +475,7 @@ var Feed = /*#__PURE__*/function () {
429
475
  key: "onNewMessageReceived",
430
476
  value: function () {
431
477
  var _onNewMessageReceived = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(_ref) {
432
- var metadata, _this$store2, getState, setState, currentHead;
478
+ var metadata, _this$store3, getState, setState, currentHead;
433
479
 
434
480
  return _regenerator["default"].wrap(function _callee9$(_context9) {
435
481
  while (1) {
@@ -437,7 +483,7 @@ var Feed = /*#__PURE__*/function () {
437
483
  case 0:
438
484
  metadata = _ref.metadata;
439
485
  // Handle the new message coming in
440
- _this$store2 = this.store, getState = _this$store2.getState, setState = _this$store2.setState;
486
+ _this$store3 = this.store, getState = _this$store3.getState, setState = _this$store3.setState;
441
487
  currentHead = getState().items[0]; // Optimistically set the badge counts
442
488
 
443
489
  setState(function (state) {
@@ -470,9 +516,9 @@ var Feed = /*#__PURE__*/function () {
470
516
  }, {
471
517
  key: "optimisticallyPerformStatusUpdate",
472
518
  value: function optimisticallyPerformStatusUpdate(itemOrItems, type, attrs, badgeCountAttr) {
473
- var _this$store3 = this.store,
474
- getState = _this$store3.getState,
475
- setState = _this$store3.setState;
519
+ var _this$store4 = this.store,
520
+ getState = _this$store4.getState,
521
+ setState = _this$store4.setState;
476
522
  var itemIds = Array.isArray(itemOrItems) ? itemOrItems.map(function (item) {
477
523
  return item.id;
478
524
  }) : [itemOrItems.id];
@@ -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","archived_at","setState","networkStatus","setNetworkStatus","__loadingType","NetworkStatus","loading","queryParams","makeRequest","method","url","userId","params","result","statusCode","status","data","body","response","entries","meta","page_info","before","opts","shouldSetPage","shouldAppend","state","setResult","after","broadcast","pageInfo","fetch","fetchMore","emit","metadata","currentHead","items","setMetadata","__cursor","type","attrs","badgeCountAttr","itemIds","Array","isArray","map","item","id","direction","startsWith","length","Math","max","setItemAttrs","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 async markAsArchived(itemOrItems: FeedItemOrItems) {\n const now = new Date().toISOString();\n this.optimisticallyPerformStatusUpdate(itemOrItems, \"archived\", {\n archived_at: now,\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","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","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 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"}
@@ -127,16 +127,53 @@ class Feed {
127
127
  return _this4.makeStatusUpdate(itemOrItems, "unread");
128
128
  })();
129
129
  }
130
+ /*
131
+ Marking one or more items as archived should:
132
+ - Decrement the badge count for any unread / unseen items
133
+ - Remove the item from the feed list, when the include_archived flag is not true)
134
+ TODO: how do we handle rollbacks?
135
+ */
136
+
130
137
 
131
138
  markAsArchived(itemOrItems) {
132
139
  var _this5 = this;
133
140
 
134
141
  return _asyncToGenerator(function* () {
135
- var now = new Date().toISOString();
136
-
137
- _this5.optimisticallyPerformStatusUpdate(itemOrItems, "archived", {
138
- archived_at: now
139
- });
142
+ var {
143
+ getState,
144
+ setState
145
+ } = _this5.store;
146
+ var state = getState();
147
+ var shouldRemoveItems = _this5.defaultOptions.include_archived !== true;
148
+ var normalizedItems = Array.isArray(itemOrItems) ? itemOrItems : [itemOrItems];
149
+ var itemIds = normalizedItems.map(item => item.id); // If any of the items are unseen or unread, then capture as we'll want to decrement
150
+ // the counts for these in the metadata we have
151
+
152
+ var unseenCount = normalizedItems.filter(i => !i.seen_at).length;
153
+ var unreadCount = normalizedItems.filter(i => !i.read_at).length; // Build the new metadata
154
+
155
+ var meta = _objectSpread(_objectSpread({}, state.metadata), {}, {
156
+ unseen_count: state.metadata.unseen_count - unseenCount,
157
+ unread_count: state.metadata.unread_count - unreadCount
158
+ }); // Perform optimistic updates on the items in the feed
159
+
160
+
161
+ if (shouldRemoveItems) {
162
+ // Filter the items out of the list
163
+ var entries = state.items.filter(item => !itemIds.includes(item.id));
164
+ setState(state => state.setResult({
165
+ entries,
166
+ meta,
167
+ page_info: state.pageInfo
168
+ }));
169
+ } else {
170
+ setState(state => {
171
+ state.setMetadata(meta);
172
+ state.setItemAttrs(itemIds, {
173
+ archived_at: new Date().toISOString()
174
+ });
175
+ });
176
+ }
140
177
 
141
178
  return _this5.makeStatusUpdate(itemOrItems, "archived");
142
179
  })();
@@ -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","archived_at","markAsUnarchived","fetch","setState","networkStatus","setNetworkStatus","__loadingType","loading","queryParams","result","makeRequest","method","url","userId","params","statusCode","status","data","body","response","entries","meta","page_info","before","opts","shouldSetPage","shouldAppend","state","setResult","after","broadcast","fetchNextPage","pageInfo","fetchMore","emit","metadata","currentHead","items","setMetadata","__cursor","type","attrs","badgeCountAttr","itemIds","Array","isArray","map","item","id","direction","startsWith","length","Math","max","setItemAttrs","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 async markAsArchived(itemOrItems: FeedItemOrItems) {\n const now = new Date().toISOString();\n this.optimisticallyPerformStatusUpdate(itemOrItems, \"archived\", {\n archived_at: now,\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":["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","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":";;;;;;;AAEA,OAAOA,YAAP,MAAyB,eAAzB;AAEA,OAAOC,WAAP,MAAwB,SAAxB;AASA,SAASC,iBAAT,EAA4BC,aAA5B,QAAiD,qBAAjD;;AAUA,MAAMC,IAAN,CAAW;AAQT;AAGAC,EAAAA,WAAW,CACAC,KADA,EAEAC,MAFA,EAGTC,OAHS,EAIT;AAAA,SAHSF,KAGT,GAHSA,KAGT;AAAA,SAFSC,MAET,GAFSA,MAET;;AAAA;;AAAA;;AAAA,8CAZkC,KAYlC;;AAAA;;AAAA;;AAAA;;AAAA;;AACA,SAAKE,SAAL,GAAiBH,KAAK,CAACI,MAAN,EAAjB;AACA,SAAKH,MAAL,GAAcA,MAAd;AACA,SAAKI,UAAL,GAAkB,KAAKC,eAAL,EAAlB;AACA,SAAKC,KAAL,GAAaZ,WAAW,EAAxB;AACA,SAAKa,WAAL,GAAmB,IAAId,YAAJ,EAAnB;AACA,SAAKe,cAAL,GAAsBP,OAAtB,CANA,CAQA;;AACA,SAAKC,SAAL,CAAeO,aAAf;AAEA,SAAKC,OAAL,GAAe,KAAKR,SAAL,CAAeS,aAAf,iBACJ,KAAKP,UADD,GAEb,KAAKI,cAFQ,CAAf;AAID;AAED;AACF;AACA;;;AACEI,EAAAA,gBAAgB,GAAG;AACjB,QAAI,CAAC,KAAKC,gBAAV,EAA4B;AAC1B,WAAKH,OAAL,CAAaI,IAAb,GAAoBC,OAApB,CAA4B,IAA5B,EAAkC,MAAM;AACtC,aAAKF,gBAAL,GAAwB,IAAxB;AACD,OAFD;AAIA,WAAKH,OAAL,CAAaM,EAAb,CAAgB,aAAhB,EAAgCC,IAAD,IAAU,KAAKC,oBAAL,CAA0BD,IAA1B,CAAzC;AACD;;AAED,WAAO,MAAM;AACX,UAAI;AACF,aAAKP,OAAL,CAAaS,KAAb;AACD,OAFD,CAEE,OAAOC,CAAP,EAAU;AACV;AACAC,QAAAA,OAAO,CAACC,KAAR,CAAc,6BAAd,EAA6CF,CAA7C;AACD;AACF,KAPD;AAQD;AAED;;;AACAJ,EAAAA,EAAE,CAACO,SAAD,EAA+BC,QAA/B,EAAqD;AACrD,SAAKjB,WAAL,CAAiBS,EAAjB,CAAoBO,SAApB,EAA+BC,QAA/B;AACD;;AAEDC,EAAAA,GAAG,CAACF,SAAD,EAA+BC,QAA/B,EAAqD;AACtD,SAAKjB,WAAL,CAAiBkB,GAAjB,CAAqBF,SAArB,EAAgCC,QAAhC;AACD;;AAEDE,EAAAA,QAAQ,GAAG;AACT,WAAO,KAAKpB,KAAL,CAAWoB,QAAX,EAAP;AACD;;AAEKC,EAAAA,UAAU,CAACC,WAAD,EAA+B;AAAA;;AAAA;AAC7C,UAAMC,GAAG,GAAG,IAAIC,IAAJ,GAAWC,WAAX,EAAZ;;AACA,MAAA,KAAI,CAACC,iCAAL,CACEJ,WADF,EAEE,MAFF,EAGE;AAAEK,QAAAA,OAAO,EAAEJ;AAAX,OAHF,EAIE,cAJF;;AAMA,aAAO,KAAI,CAACK,gBAAL,CAAsBN,WAAtB,EAAmC,MAAnC,CAAP;AAR6C;AAS9C;;AAEKO,EAAAA,YAAY,CAACP,WAAD,EAA+B;AAAA;;AAAA;AAC/C,MAAA,MAAI,CAACI,iCAAL,CACEJ,WADF,EAEE,QAFF,EAGE;AAAEK,QAAAA,OAAO,EAAE;AAAX,OAHF,EAIE,cAJF;;AAMA,aAAO,MAAI,CAACC,gBAAL,CAAsBN,WAAtB,EAAmC,QAAnC,CAAP;AAP+C;AAQhD;;AAEKQ,EAAAA,UAAU,CAACR,WAAD,EAA+B;AAAA;;AAAA;AAC7C,UAAMC,GAAG,GAAG,IAAIC,IAAJ,GAAWC,WAAX,EAAZ;;AACA,MAAA,MAAI,CAACC,iCAAL,CACEJ,WADF,EAEE,MAFF,EAGE;AAAES,QAAAA,OAAO,EAAER;AAAX,OAHF,EAIE,cAJF;;AAMA,aAAO,MAAI,CAACK,gBAAL,CAAsBN,WAAtB,EAAmC,MAAnC,CAAP;AAR6C;AAS9C;;AAEKU,EAAAA,YAAY,CAACV,WAAD,EAA+B;AAAA;;AAAA;AAC/C,MAAA,MAAI,CAACI,iCAAL,CACEJ,WADF,EAEE,QAFF,EAGE;AAAES,QAAAA,OAAO,EAAE;AAAX,OAHF,EAIE,cAJF;;AAMA,aAAO,MAAI,CAACH,gBAAL,CAAsBN,WAAtB,EAAmC,QAAnC,CAAP;AAP+C;AAQhD;AAED;AACF;AACA;AACA;AACA;AACA;;;AAGQW,EAAAA,cAAc,CAACX,WAAD,EAA+B;AAAA;;AAAA;AACjD,UAAM;AAAEF,QAAAA,QAAF;AAAYc,QAAAA;AAAZ,UAAyB,MAAI,CAAClC,KAApC;AACA,UAAMmC,KAAK,GAAGf,QAAQ,EAAtB;AACA,UAAMgB,iBAAiB,GAAG,MAAI,CAAClC,cAAL,CAAoBmC,gBAApB,KAAyC,IAAnE;AAEA,UAAMC,eAAe,GAAGC,KAAK,CAACC,OAAN,CAAclB,WAAd,IACpBA,WADoB,GAEpB,CAACA,WAAD,CAFJ;AAIA,UAAMmB,OAAiB,GAAGH,eAAe,CAACI,GAAhB,CAAqBC,IAAD,IAAUA,IAAI,CAACC,EAAnC,CAA1B,CATiD,CAWjD;AACA;;AACA,UAAMC,WAAW,GAAGP,eAAe,CAACQ,MAAhB,CAAwBC,CAAD,IAAO,CAACA,CAAC,CAACpB,OAAjC,EAA0CqB,MAA9D;AACA,UAAMC,WAAW,GAAGX,eAAe,CAACQ,MAAhB,CAAwBC,CAAD,IAAO,CAACA,CAAC,CAAChB,OAAjC,EAA0CiB,MAA9D,CAdiD,CAgBjD;;AACA,UAAME,IAAI,mCACLf,KAAK,CAACgB,QADD;AAERC,QAAAA,YAAY,EAAEjB,KAAK,CAACgB,QAAN,CAAeC,YAAf,GAA8BP,WAFpC;AAGRQ,QAAAA,YAAY,EAAElB,KAAK,CAACgB,QAAN,CAAeE,YAAf,GAA8BJ;AAHpC,QAAV,CAjBiD,CAuBjD;;;AACA,UAAIb,iBAAJ,EAAuB;AACrB;AACA,YAAMkB,OAAO,GAAGnB,KAAK,CAACoB,KAAN,CAAYT,MAAZ,CAAoBH,IAAD,IAAU,CAACF,OAAO,CAACe,QAAR,CAAiBb,IAAI,CAACC,EAAtB,CAA9B,CAAhB;AAEAV,QAAAA,QAAQ,CAAEC,KAAD,IACPA,KAAK,CAACsB,SAAN,CAAgB;AAAEH,UAAAA,OAAF;AAAWJ,UAAAA,IAAX;AAAiBQ,UAAAA,SAAS,EAAEvB,KAAK,CAACwB;AAAlC,SAAhB,CADM,CAAR;AAGD,OAPD,MAOO;AACLzB,QAAAA,QAAQ,CAAEC,KAAD,IAAW;AAClBA,UAAAA,KAAK,CAACyB,WAAN,CAAkBV,IAAlB;AACAf,UAAAA,KAAK,CAAC0B,YAAN,CAAmBpB,OAAnB,EAA4B;AAAEqB,YAAAA,WAAW,EAAE,IAAItC,IAAJ,GAAWC,WAAX;AAAf,WAA5B;AACD,SAHO,CAAR;AAID;;AAED,aAAO,MAAI,CAACG,gBAAL,CAAsBN,WAAtB,EAAmC,UAAnC,CAAP;AAtCiD;AAuClD;;AAEKyC,EAAAA,gBAAgB,CAACzC,WAAD,EAA+B;AAAA;;AAAA;AACnD,MAAA,MAAI,CAACI,iCAAL,CAAuCJ,WAAvC,EAAoD,YAApD,EAAkE;AAChEwC,QAAAA,WAAW,EAAE;AADmD,OAAlE;;AAGA,aAAO,MAAI,CAAClC,gBAAL,CAAsBN,WAAtB,EAAmC,YAAnC,CAAP;AAJmD;AAKpD;AAED;;;AACM0C,EAAAA,KAAK,GAAiC;AAAA;AAAA;;AAAA;AAAA,UAAhCrE,OAAgC,0EAAJ,EAAI;AAC1C,UAAM;AAAEuC,QAAAA,QAAF;AAAYd,QAAAA;AAAZ,UAAyB,MAAI,CAACpB,KAApC;AACA,UAAM;AAAEiE,QAAAA;AAAF,UAAoB7C,QAAQ,EAAlC,CAF0C,CAI1C;;AACA,UAAI/B,iBAAiB,CAAC4E,aAAD,CAArB,EAAsC;AACpC;AACD,OAPyC,CAS1C;;;AACA/B,MAAAA,QAAQ,CAAElC,KAAD;AAAA;;AAAA,eACPA,KAAK,CAACkE,gBAAN,0BAAuBvE,OAAO,CAACwE,aAA/B,yEAAgD7E,aAAa,CAAC8E,OAA9D,CADO;AAAA,OAAD,CAAR,CAV0C,CAc1C;;AACA,UAAMC,WAAW,mCAAQ,MAAI,CAACnE,cAAb,GAAgCP,OAAhC,CAAjB;;AAEA,UAAM2E,MAAM,SAAS,MAAI,CAAC1E,SAAL,CAAe2E,WAAf,CAA2B;AAC9CC,QAAAA,MAAM,EAAE,KADsC;AAE9CC,QAAAA,GAAG,sBAAe,MAAI,CAAChF,KAAL,CAAWiF,MAA1B,oBAA0C,MAAI,CAAChF,MAA/C,CAF2C;AAG9CiF,QAAAA,MAAM,EAAEN;AAHsC,OAA3B,CAArB;;AAMA,UAAIC,MAAM,CAACM,UAAP,KAAsB,OAA1B,EAAmC;AACjC1C,QAAAA,QAAQ,CAAElC,KAAD,IAAWA,KAAK,CAACkE,gBAAN,CAAuB5E,aAAa,CAAC0B,KAArC,CAAZ,CAAR;AAEA,eAAO;AACL6D,UAAAA,MAAM,EAAEP,MAAM,CAACM,UADV;AAELE,UAAAA,IAAI,EAAER,MAAM,CAACtD,KAAP,IAAgBsD,MAAM,CAACS;AAFxB,SAAP;AAID;;AAED,UAAMC,QAAQ,GAAG;AACf1B,QAAAA,OAAO,EAAEgB,MAAM,CAACS,IAAP,CAAYzB,OADN;AAEfJ,QAAAA,IAAI,EAAEoB,MAAM,CAACS,IAAP,CAAY7B,IAFH;AAGfQ,QAAAA,SAAS,EAAEY,MAAM,CAACS,IAAP,CAAYrB;AAHR,OAAjB;;AAMA,UAAI/D,OAAO,CAACsF,MAAZ,EAAoB;AAClB,YAAMC,IAAI,GAAG;AAAEC,UAAAA,aAAa,EAAE,KAAjB;AAAwBC,UAAAA,YAAY,EAAE;AAAtC,SAAb;AACAlD,QAAAA,QAAQ,CAAEC,KAAD,IAAWA,KAAK,CAACsB,SAAN,CAAgBuB,QAAhB,EAA0BE,IAA1B,CAAZ,CAAR;AACD,OAHD,MAGO,IAAIvF,OAAO,CAAC0F,KAAZ,EAAmB;AACxB,YAAMH,KAAI,GAAG;AAAEC,UAAAA,aAAa,EAAE,IAAjB;AAAuBC,UAAAA,YAAY,EAAE;AAArC,SAAb;AACAlD,QAAAA,QAAQ,CAAEC,KAAD,IAAWA,KAAK,CAACsB,SAAN,CAAgBuB,QAAhB,EAA0BE,KAA1B,CAAZ,CAAR;AACD,OAHM,MAGA;AACLhD,QAAAA,QAAQ,CAAEC,KAAD,IAAWA,KAAK,CAACsB,SAAN,CAAgBuB,QAAhB,CAAZ,CAAR;AACD;;AAED,MAAA,MAAI,CAACM,SAAL,CAAe,cAAf,EAA+BN,QAA/B;;AACA,aAAO;AAAEF,QAAAA,IAAI,EAAEE,QAAR;AAAkBH,QAAAA,MAAM,EAAEP,MAAM,CAACM;AAAjC,OAAP;AAjD0C;AAkD3C;;AAEKW,EAAAA,aAAa,GAAG;AAAA;;AAAA;AACpB;AACA,UAAM;AAAEnE,QAAAA;AAAF,UAAe,MAAI,CAACpB,KAA1B;AACA,UAAM;AAAE2D,QAAAA;AAAF,UAAevC,QAAQ,EAA7B;;AAEA,UAAI,CAACuC,QAAQ,CAAC0B,KAAd,EAAqB;AACnB;AACA;AACD;;AAED,MAAA,MAAI,CAACrB,KAAL,CAAW;AACTqB,QAAAA,KAAK,EAAE1B,QAAQ,CAAC0B,KADP;AAETlB,QAAAA,aAAa,EAAE7E,aAAa,CAACkG;AAFpB,OAAX;AAVoB;AAcrB;;AAEOF,EAAAA,SAAS,CAACrE,SAAD,EAA+B6D,IAA/B,EAA0C;AACzD,SAAK7E,WAAL,CAAiBwF,IAAjB,CAAsBxE,SAAtB,EAAiC6D,IAAjC;AACD,GA5OQ,CA8OT;;;AACclE,EAAAA,oBAAoB,OAEF;AAAA;;AAAA;AAAA,UAFG;AACjCuC,QAAAA;AADiC,OAEH;AAC9B;AACA,UAAM;AAAE/B,QAAAA,QAAF;AAAYc,QAAAA;AAAZ,UAAyB,MAAI,CAAClC,KAApC;AACA,UAAM0F,WAAiC,GAAGtE,QAAQ,GAAGmC,KAAX,CAAiB,CAAjB,CAA1C,CAH8B,CAI9B;;AACArB,MAAAA,QAAQ,CAAEC,KAAD,IAAWA,KAAK,CAACyB,WAAN,CAAkBT,QAAlB,CAAZ,CAAR,CAL8B,CAM9B;;AACA,MAAA,MAAI,CAACa,KAAL,CAAW;AAAEiB,QAAAA,MAAM,EAAES,WAAF,aAAEA,WAAF,uBAAEA,WAAW,CAAEC;AAAvB,OAAX;AAP8B;AAQ/B;;AAEO5F,EAAAA,eAAe,GAAG;AACxB,qBAAU,KAAKL,MAAf,cAAyB,KAAKD,KAAL,CAAWiF,MAApC;AACD;;AAEOhD,EAAAA,iCAAiC,CACvCJ,WADuC,EAEvCsE,IAFuC,EAGvCC,KAHuC,EAIvCC,cAJuC,EAKvC;AACA,QAAM;AAAE1E,MAAAA,QAAF;AAAYc,MAAAA;AAAZ,QAAyB,KAAKlC,KAApC;AACA,QAAMyC,OAAO,GAAGF,KAAK,CAACC,OAAN,CAAclB,WAAd,IACZA,WAAW,CAACoB,GAAZ,CAAiBC,IAAD,IAAUA,IAAI,CAACC,EAA/B,CADY,GAEZ,CAACtB,WAAW,CAACsB,EAAb,CAFJ;;AAIA,QAAIkD,cAAJ,EAAoB;AAClB,UAAM;AAAE3C,QAAAA;AAAF,UAAe/B,QAAQ,EAA7B,CADkB,CAGlB;AACA;;AACA,UAAM2E,SAAS,GAAGH,IAAI,CAACI,UAAL,CAAgB,IAAhB,IACdvD,OAAO,CAACO,MADM,GAEd,CAACP,OAAO,CAACO,MAFb;AAIAd,MAAAA,QAAQ,CAAElC,KAAD,IACPA,KAAK,CAAC4D,WAAN,iCACKT,QADL;AAEE,SAAC2C,cAAD,GAAkBG,IAAI,CAACC,GAAL,CAAS,CAAT,EAAY/C,QAAQ,CAAC2C,cAAD,CAAR,GAA2BC,SAAvC;AAFpB,SADM,CAAR;AAMD,KArBD,CAuBA;;;AACA7D,IAAAA,QAAQ,CAAElC,KAAD,IAAWA,KAAK,CAAC6D,YAAN,CAAmBpB,OAAnB,EAA4BoD,KAA5B,CAAZ,CAAR;AACD;;AAEajE,EAAAA,gBAAgB,CAACN,WAAD,EAA+BsE,IAA/B,EAA6C;AAAA;;AAAA;AACzE;AACA,UAAIrD,KAAK,CAACC,OAAN,CAAclB,WAAd,CAAJ,EAAgC;AAC9B,YAAMmB,OAAO,GAAGnB,WAAW,CAACoB,GAAZ,CAAiBC,IAAD,IAAUA,IAAI,CAACC,EAA/B,CAAhB;AAEA,qBAAa,OAAI,CAAChD,SAAL,CAAe2E,WAAf,CAA2B;AACtCC,UAAAA,MAAM,EAAE,MAD8B;AAEtCC,UAAAA,GAAG,+BAAwBmB,IAAxB,CAFmC;AAGtCd,UAAAA,IAAI,EAAE;AAAEqB,YAAAA,WAAW,EAAE1D;AAAf;AAHgC,SAA3B,CAAb;AAKD,OAVwE,CAYzE;;;AACA,UAAM6B,MAAM,SAAS,OAAI,CAAC1E,SAAL,CAAe2E,WAAf,CAA2B;AAC9CC,QAAAA,MAAM,EAAEoB,IAAI,CAACI,UAAL,CAAgB,IAAhB,IAAwB,QAAxB,GAAmC,KADG;AAE9CvB,QAAAA,GAAG,yBAAkBnD,WAAW,CAACsB,EAA9B,cAAoCgD,IAApC;AAF2C,OAA3B,CAArB;AAKA,aAAOtB,MAAP;AAlByE;AAmB1E;;AAlTQ;;AAqTX,eAAe/E,IAAf","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 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 +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,EAEL,iBAAiB,EACjB,eAAe,EACf,cAAc,EACf,MAAM,SAAS,CAAC;AACjB,OAAO,EAAY,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC7E,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,CAAkB;IAC1C,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,CAAC,SAAS,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,IAAI;IAIrD,GAAG,CAAC,SAAS,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,IAAI;IAItD,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;IAUzC,cAAc,CAAC,WAAW,EAAE,eAAe;IAQ3C,gBAAgB,CAAC,WAAW,EAAE,eAAe;IAQ7C,KAAK,CAAC,OAAO,GAAE,gBAAqB;;;;;;;;;;;IAoDpC,aAAa;IAgBnB,OAAO,CAAC,SAAS;YAKH,oBAAoB;IAYlC,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iCAAiC;YAgC3B,gBAAgB;CAoB/B;AAED,eAAe,IAAI,CAAC"}
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,EAEL,iBAAiB,EACjB,eAAe,EACf,cAAc,EACf,MAAM,SAAS,CAAC;AACjB,OAAO,EAAY,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC7E,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,CAAkB;IAC1C,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,CAAC,SAAS,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,IAAI;IAIrD,GAAG,CAAC,SAAS,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,IAAI;IAItD,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;IAyC3C,gBAAgB,CAAC,WAAW,EAAE,eAAe;IAQ7C,KAAK,CAAC,OAAO,GAAE,gBAAqB;;;;;;;;;;;IAoDpC,aAAa;IAgBnB,OAAO,CAAC,SAAS;YAKH,oBAAoB;IAYlC,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iCAAiC;YAgC3B,gBAAgB;CAoB/B;AAED,eAAe,IAAI,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knocklabs/client",
3
- "version": "0.4.5-rc.1",
3
+ "version": "0.4.5-rc.2",
4
4
  "description": "The clientside library for interacting with Knock",
5
5
  "homepage": "https://github.com/knocklabs/knock-client-js",
6
6
  "author": "@knocklabs",