@knocklabs/client 0.5.3 → 0.5.4

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.
Files changed (62) hide show
  1. package/README.md +13 -3
  2. package/dist/cjs/{knock.js → Knock.js} +1 -1
  3. package/dist/cjs/{knock.js.map → Knock.js.map} +1 -1
  4. package/dist/cjs/api.js +0 -1
  5. package/dist/cjs/api.js.map +1 -1
  6. package/dist/cjs/clients/{feed → Feed}/feed.js +30 -14
  7. package/dist/cjs/clients/Feed/feed.js.map +1 -0
  8. package/dist/cjs/clients/{feed → Feed}/index.js +0 -0
  9. package/dist/cjs/clients/{feed → Feed}/index.js.map +1 -1
  10. package/dist/cjs/clients/Feed/interfaces.js +6 -0
  11. package/dist/cjs/clients/{feed → Feed}/interfaces.js.map +0 -0
  12. package/dist/cjs/clients/{feed → Feed}/store.js +2 -2
  13. package/dist/cjs/clients/{feed → Feed}/store.js.map +1 -1
  14. package/dist/cjs/clients/Feed/types.js +6 -0
  15. package/dist/cjs/clients/{feed → Feed}/types.js.map +0 -0
  16. package/dist/cjs/clients/{feed → Feed}/utils.js +0 -0
  17. package/dist/cjs/clients/{feed → Feed}/utils.js.map +1 -1
  18. package/dist/cjs/clients/preferences/interfaces.js +4 -0
  19. package/dist/cjs/index.js +4 -4
  20. package/dist/cjs/interfaces.js +4 -0
  21. package/dist/cjs/networkStatus.js +1 -1
  22. package/dist/esm/{knock.js → Knock.js} +1 -1
  23. package/dist/esm/{knock.js.map → Knock.js.map} +1 -1
  24. package/dist/esm/api.js +1 -2
  25. package/dist/esm/api.js.map +1 -1
  26. package/dist/esm/clients/{feed → Feed}/feed.js +27 -9
  27. package/dist/esm/clients/Feed/feed.js.map +1 -0
  28. package/dist/esm/clients/{feed → Feed}/index.js +0 -0
  29. package/dist/esm/clients/{feed → Feed}/index.js.map +1 -1
  30. package/dist/esm/clients/Feed/interfaces.js +2 -0
  31. package/dist/esm/clients/{feed → Feed}/interfaces.js.map +0 -0
  32. package/dist/esm/clients/{feed → Feed}/store.js +2 -2
  33. package/dist/esm/clients/{feed → Feed}/store.js.map +1 -1
  34. package/dist/esm/clients/Feed/types.js +2 -0
  35. package/dist/esm/clients/{feed → Feed}/types.js.map +0 -0
  36. package/dist/esm/clients/{feed → Feed}/utils.js +0 -0
  37. package/dist/esm/clients/{feed → Feed}/utils.js.map +1 -1
  38. package/dist/esm/clients/preferences/interfaces.js +1 -1
  39. package/dist/esm/interfaces.js +1 -1
  40. package/dist/types/{knock.d.ts → Knock.d.ts} +1 -1
  41. package/dist/types/{knock.d.ts.map → Knock.d.ts.map} +1 -1
  42. package/dist/types/api.d.ts.map +1 -1
  43. package/dist/types/clients/feed/feed.d.ts +4 -11
  44. package/dist/types/clients/feed/feed.d.ts.map +1 -1
  45. package/dist/types/clients/feed/interfaces.d.ts +4 -2
  46. package/dist/types/clients/feed/interfaces.d.ts.map +1 -1
  47. package/dist/types/clients/feed/store.d.ts.map +1 -1
  48. package/dist/types/clients/feed/types.d.ts +9 -0
  49. package/dist/types/clients/feed/types.d.ts.map +1 -1
  50. package/dist/types/clients/feed/utils.d.ts +1 -1
  51. package/dist/types/clients/feed/utils.d.ts.map +1 -1
  52. package/dist/types/clients/preferences/interfaces.d.ts +2 -3
  53. package/dist/types/clients/preferences/interfaces.d.ts.map +1 -1
  54. package/dist/types/interfaces.d.ts +6 -3
  55. package/dist/types/interfaces.d.ts.map +1 -1
  56. package/package.json +13 -11
  57. package/dist/cjs/clients/feed/feed.js.map +0 -1
  58. package/dist/cjs/clients/feed/interfaces.js +0 -2
  59. package/dist/cjs/clients/feed/types.js +0 -2
  60. package/dist/esm/clients/feed/feed.js.map +0 -1
  61. package/dist/esm/clients/feed/interfaces.js +0 -2
  62. package/dist/esm/clients/feed/types.js +0 -2
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 messages is received (including on first load)
71
- feedClient.on("messages.new", ({ entries }) => {
72
- console.log(entries);
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
@@ -83,4 +83,4 @@ var Knock = /*#__PURE__*/function () {
83
83
 
84
84
  var _default = Knock;
85
85
  exports["default"] = _default;
86
- //# sourceMappingURL=knock.js.map
86
+ //# sourceMappingURL=Knock.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/knock.ts"],"names":["DEFAULT_HOST","Knock","apiKey","options","FeedClient","Preferences","host","startsWith","Error","userId","userToken","console","warn","apiClient","ApiClient","disconnectSocket"],"mappings":";;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AAGA,IAAMA,YAAY,GAAG,uBAArB;;IAEMC,K;AASJ,iBAAqBC,MAArB,EAAiE;AAAA,QAA5BC,OAA4B,uEAAJ,EAAI;AAAA;AAAA,SAA5CD,MAA4C,GAA5CA,MAA4C;AAAA;AAAA;AAAA,wDAN3B,IAM2B;AAAA;AAAA,oDAHhD,IAAIE,gBAAJ,CAAe,IAAf,CAGgD;AAAA,0DAF1C,IAAIC,uBAAJ,CAAgB,IAAhB,CAE0C;AAC/D,SAAKC,IAAL,GAAYH,OAAO,CAACG,IAAR,IAAgBN,YAA5B,CAD+D,CAG/D;;AACA,QAAI,KAAKE,MAAL,IAAe,KAAKA,MAAL,CAAYK,UAAZ,CAAuB,KAAvB,CAAnB,EAAkD;AAChD,YAAM,IAAIC,KAAJ,CACJ,qFADI,CAAN;AAGD;AACF;;;;WAED,kBAAS;AACP,UAAI,CAAC,KAAKC,MAAN,IAAgB,CAAC,KAAKC,SAA1B,EAAqC;AACnCC,QAAAA,OAAO,CAACC,IAAR;AAOD,OATM,CAWP;;;AACA,UAAI,CAAC,KAAKC,SAAV,EAAqB;AACnB,aAAKA,SAAL,GAAiB,IAAIC,eAAJ,CAAc;AAC7BZ,UAAAA,MAAM,EAAE,KAAKA,MADgB;AAE7BI,UAAAA,IAAI,EAAE,KAAKA,IAFkB;AAG7BI,UAAAA,SAAS,EAAE,KAAKA;AAHa,SAAd,CAAjB;AAKD;;AAED,aAAO,KAAKG,SAAZ;AACD;AAED;AACF;AACA;AACA;;;;WACE,sBAAaJ,MAAb,EAA6BC,SAA7B,EAAiD;AAC/C,WAAKD,MAAL,GAAcA,MAAd;AACA,WAAKC,SAAL,GAAiBA,SAAjB;AAEA;AACD,K,CAED;;;;WACA,oBAAW;AACT,UAAI,KAAKG,SAAT,EAAoB;AAClB,aAAKA,SAAL,CAAeE,gBAAf;AACD;AACF;;;;;eAGYd,K","sourcesContent":["import ApiClient from \"./api\";\nimport FeedClient from \"./clients/feed\";\nimport Preferences from \"./clients/preferences\";\nimport { KnockOptions } from \"./interfaces\";\n\nconst DEFAULT_HOST = \"https://api.knock.app\";\n\nclass Knock {\n private host: string;\n private userToken: string | undefined;\n private apiClient: ApiClient | null = null;\n public userId: string | undefined;\n\n readonly feeds = new FeedClient(this);\n readonly preferences = new Preferences(this);\n\n constructor(readonly apiKey: string, options: KnockOptions = {}) {\n this.host = options.host || DEFAULT_HOST;\n\n // Fail loudly if we're using the wrong API key\n if (this.apiKey && this.apiKey.startsWith(\"sk_\")) {\n throw new Error(\n \"[Knock] You are using your secret API key on the client. Please use the public key.\",\n );\n }\n }\n\n client() {\n if (!this.userId && !this.userToken) {\n console.warn(\n `[Knock] You must call authenticate(userId, userToken) first before trying to make a request.\n Typically you'll see this message when you're creating a feed instance before having called\n authenticate with a user Id and token. That means we won't know who to issue the request\n to Knock on behalf of.\n `,\n );\n }\n\n // Initiate a new API client if we don't have one yet\n if (!this.apiClient) {\n this.apiClient = new ApiClient({\n apiKey: this.apiKey,\n host: this.host,\n userToken: this.userToken,\n });\n }\n\n return this.apiClient;\n }\n\n /*\n Authenticates the current user. In non-sandbox environments\n the userToken must be specified.\n */\n authenticate(userId: string, userToken?: string) {\n this.userId = userId;\n this.userToken = userToken;\n\n return;\n }\n\n // Used to teardown any connected instances\n teardown() {\n if (this.apiClient) {\n this.apiClient.disconnectSocket();\n }\n }\n}\n\nexport default Knock;\n"],"file":"knock.js"}
1
+ {"version":3,"sources":["../../src/Knock.ts"],"names":["DEFAULT_HOST","Knock","apiKey","options","FeedClient","Preferences","host","startsWith","Error","userId","userToken","console","warn","apiClient","ApiClient","disconnectSocket"],"mappings":";;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AAGA,IAAMA,YAAY,GAAG,uBAArB;;IAEMC,K;AASJ,iBAAqBC,MAArB,EAAiE;AAAA,QAA5BC,OAA4B,uEAAJ,EAAI;AAAA;AAAA,SAA5CD,MAA4C,GAA5CA,MAA4C;AAAA;AAAA;AAAA,wDAN3B,IAM2B;AAAA;AAAA,oDAHhD,IAAIE,gBAAJ,CAAe,IAAf,CAGgD;AAAA,0DAF1C,IAAIC,uBAAJ,CAAgB,IAAhB,CAE0C;AAC/D,SAAKC,IAAL,GAAYH,OAAO,CAACG,IAAR,IAAgBN,YAA5B,CAD+D,CAG/D;;AACA,QAAI,KAAKE,MAAL,IAAe,KAAKA,MAAL,CAAYK,UAAZ,CAAuB,KAAvB,CAAnB,EAAkD;AAChD,YAAM,IAAIC,KAAJ,CACJ,qFADI,CAAN;AAGD;AACF;;;;WAED,kBAAS;AACP,UAAI,CAAC,KAAKC,MAAN,IAAgB,CAAC,KAAKC,SAA1B,EAAqC;AACnCC,QAAAA,OAAO,CAACC,IAAR;AAOD,OATM,CAWP;;;AACA,UAAI,CAAC,KAAKC,SAAV,EAAqB;AACnB,aAAKA,SAAL,GAAiB,IAAIC,eAAJ,CAAc;AAC7BZ,UAAAA,MAAM,EAAE,KAAKA,MADgB;AAE7BI,UAAAA,IAAI,EAAE,KAAKA,IAFkB;AAG7BI,UAAAA,SAAS,EAAE,KAAKA;AAHa,SAAd,CAAjB;AAKD;;AAED,aAAO,KAAKG,SAAZ;AACD;AAED;AACF;AACA;AACA;;;;WACE,sBAAaJ,MAAb,EAA6BC,SAA7B,EAAiD;AAC/C,WAAKD,MAAL,GAAcA,MAAd;AACA,WAAKC,SAAL,GAAiBA,SAAjB;AAEA;AACD,K,CAED;;;;WACA,oBAAW;AACT,UAAI,KAAKG,SAAT,EAAoB;AAClB,aAAKA,SAAL,CAAeE,gBAAf;AACD;AACF;;;;;eAGYd,K","sourcesContent":["import ApiClient from \"./api\";\nimport FeedClient from \"./clients/feed\";\nimport Preferences from \"./clients/preferences\";\nimport { KnockOptions } from \"./interfaces\";\n\nconst DEFAULT_HOST = \"https://api.knock.app\";\n\nclass Knock {\n private host: string;\n private userToken: string | undefined;\n private apiClient: ApiClient | null = null;\n public userId: string | undefined;\n\n readonly feeds = new FeedClient(this);\n readonly preferences = new Preferences(this);\n\n constructor(readonly apiKey: string, options: KnockOptions = {}) {\n this.host = options.host || DEFAULT_HOST;\n\n // Fail loudly if we're using the wrong API key\n if (this.apiKey && this.apiKey.startsWith(\"sk_\")) {\n throw new Error(\n \"[Knock] You are using your secret API key on the client. Please use the public key.\",\n );\n }\n }\n\n client() {\n if (!this.userId && !this.userToken) {\n console.warn(\n `[Knock] You must call authenticate(userId, userToken) first before trying to make a request.\n Typically you'll see this message when you're creating a feed instance before having called\n authenticate with a user Id and token. That means we won't know who to issue the request\n to Knock on behalf of.\n `,\n );\n }\n\n // Initiate a new API client if we don't have one yet\n if (!this.apiClient) {\n this.apiClient = new ApiClient({\n apiKey: this.apiKey,\n host: this.host,\n userToken: this.userToken,\n });\n }\n\n return this.apiClient;\n }\n\n /*\n Authenticates the current user. In non-sandbox environments\n the userToken must be specified.\n */\n authenticate(userId: string, userToken?: string) {\n this.userId = userId;\n this.userToken = userToken;\n\n return;\n }\n\n // Used to teardown any connected instances\n teardown() {\n if (this.apiClient) {\n this.apiClient.disconnectSocket();\n }\n }\n}\n\nexport default Knock;\n"],"file":"Knock.js"}
package/dist/cjs/api.js CHANGED
@@ -108,7 +108,6 @@ var ApiClient = /*#__PURE__*/function () {
108
108
  case 7:
109
109
  _context.prev = 7;
110
110
  _context.t0 = _context["catch"](0);
111
- // tslint:disable-next-line
112
111
  console.error(_context.t0);
113
112
  return _context.abrupt("return", {
114
113
  statusCode: "error",
@@ -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":"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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 error?: any;\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: boolean = 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 } catch (e) {\n // tslint:disable-next-line\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
+ {"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 = _interopRequireDefault(require("eventemitter3"));
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); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
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] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
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["default"]();
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
- this.broadcast("messages.new", response);
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 17:
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
- currentHead = getState().items[0]; // Optimistically set the badge counts
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 5:
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 _getState3 = getState(),
529
- metadata = _getState3.metadata; // Tnis is a hack to determine the direction of whether we're
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
 
@@ -0,0 +1 @@
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"}
File without changes
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/clients/feed/index.ts"],"names":["FeedClient","instance","feedChannelId","options","Feed"],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA;;IAGMA,U;AAGJ,sBAAYC,QAAZ,EAA6B;AAAA;AAAA;AAC3B,SAAKA,QAAL,GAAgBA,QAAhB;AACD;;;;WAED,oBAAWC,aAAX,EAAmE;AAAA,UAAjCC,OAAiC,uEAAJ,EAAI;AACjE,aAAO,IAAIC,gBAAJ,CAAS,KAAKH,QAAd,EAAwBC,aAAxB,EAAuCC,OAAvC,CAAP;AACD;;;;;eAIYH,U","sourcesContent":["import Knock from \"../../knock\";\nimport Feed from \"./feed\";\nimport { FeedClientOptions } from \"./interfaces\";\n\nclass FeedClient {\n private instance: Knock;\n\n constructor(instance: Knock) {\n this.instance = instance;\n }\n\n initialize(feedChannelId: string, options: FeedClientOptions = {}) {\n return new Feed(this.instance, feedChannelId, options);\n }\n}\n\nexport { Feed };\nexport default FeedClient;\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../../../src/clients/Feed/index.ts"],"names":["FeedClient","instance","feedChannelId","options","Feed"],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA;;IAGMA,U;AAGJ,sBAAYC,QAAZ,EAA6B;AAAA;AAAA;AAC3B,SAAKA,QAAL,GAAgBA,QAAhB;AACD;;;;WAED,oBAAWC,aAAX,EAAmE;AAAA,UAAjCC,OAAiC,uEAAJ,EAAI;AACjE,aAAO,IAAIC,gBAAJ,CAAS,KAAKH,QAAd,EAAwBC,aAAxB,EAAuCC,OAAvC,CAAP;AACD;;;;;eAIYH,U","sourcesContent":["import Knock from \"../../knock\";\nimport Feed from \"./feed\";\nimport { FeedClientOptions } from \"./interfaces\";\n\nclass FeedClient {\n private instance: Knock;\n\n constructor(instance: Knock) {\n this.instance = instance;\n }\n\n initialize(feedChannelId: string, options: FeedClientOptions = {}) {\n return new Feed(this.instance, feedChannelId, options);\n }\n}\n\nexport { Feed };\nexport default FeedClient;\n"],"file":"index.js"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=interfaces.js.map
@@ -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); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
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] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
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":"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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 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
+ {"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"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=types.js.map
File without changes
File without changes
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/clients/feed/utils.ts"],"names":["deduplicateItems","items","seen","values","reduce","acc","item","id","sortItems","sort","a","b","Date","inserted_at","getTime"],"mappings":";;;;;;;;;;;;AAEO,SAASA,gBAAT,CAA0BC,KAA1B,EAAyD;AAC9D,MAAMC,IAAI,GAAG,EAAb;AACA,MAAMC,MAAkB,GAAG,EAA3B;AAEA,SAAOF,KAAK,CAACG,MAAN,CAAa,UAACC,GAAD,EAAMC,IAAN,EAAe;AACjC,QAAIJ,IAAI,CAACI,IAAI,CAACC,EAAN,CAAR,EAAmB;AACjB,aAAOF,GAAP;AACD;;AAEDH,IAAAA,IAAI,CAACI,IAAI,CAACC,EAAN,CAAJ,GAAgB,IAAhB;AACA,yDAAWF,GAAX,IAAgBC,IAAhB;AACD,GAPM,EAOJH,MAPI,CAAP;AAQD;;AAEM,SAASK,SAAT,CAAmBP,KAAnB,EAAsC;AAC3C,SAAOA,KAAK,CAACQ,IAAN,CAAW,UAACC,CAAD,EAAIC,CAAJ,EAAU;AAC1B,WACE,IAAIC,IAAJ,CAASD,CAAC,CAACE,WAAX,EAAwBC,OAAxB,KAAoC,IAAIF,IAAJ,CAASF,CAAC,CAACG,WAAX,EAAwBC,OAAxB,EADtC;AAGD,GAJM,CAAP;AAKD","sourcesContent":["import { FeedItem } from \"./interfaces\";\n\nexport function deduplicateItems(items: FeedItem[]): FeedItem[] {\n const seen = {};\n const values: FeedItem[] = [];\n\n return items.reduce((acc, item) => {\n if (seen[item.id]) {\n return acc;\n }\n\n seen[item.id] = true;\n return [...acc, item];\n }, values);\n}\n\nexport function sortItems(items: FeedItem[]) {\n return items.sort((a, b) => {\n return (\n new Date(b.inserted_at).getTime() - new Date(a.inserted_at).getTime()\n );\n });\n}\n"],"file":"utils.js"}
1
+ {"version":3,"sources":["../../../../src/clients/Feed/utils.ts"],"names":["deduplicateItems","items","seen","values","reduce","acc","item","id","sortItems","sort","a","b","Date","inserted_at","getTime"],"mappings":";;;;;;;;;;;;AAEO,SAASA,gBAAT,CAA0BC,KAA1B,EAAyD;AAC9D,MAAMC,IAAI,GAAG,EAAb;AACA,MAAMC,MAAkB,GAAG,EAA3B;AAEA,SAAOF,KAAK,CAACG,MAAN,CAAa,UAACC,GAAD,EAAMC,IAAN,EAAe;AACjC,QAAIJ,IAAI,CAACI,IAAI,CAACC,EAAN,CAAR,EAAmB;AACjB,aAAOF,GAAP;AACD;;AAEDH,IAAAA,IAAI,CAACI,IAAI,CAACC,EAAN,CAAJ,GAAgB,IAAhB;AACA,yDAAWF,GAAX,IAAgBC,IAAhB;AACD,GAPM,EAOJH,MAPI,CAAP;AAQD;;AAEM,SAASK,SAAT,CAAmBP,KAAnB,EAAsC;AAC3C,SAAOA,KAAK,CAACQ,IAAN,CAAW,UAACC,CAAD,EAAIC,CAAJ,EAAU;AAC1B,WACE,IAAIC,IAAJ,CAASD,CAAC,CAACE,WAAX,EAAwBC,OAAxB,KAAoC,IAAIF,IAAJ,CAASF,CAAC,CAACG,WAAX,EAAwBC,OAAxB,EADtC;AAGD,GAJM,CAAP;AAKD","sourcesContent":["import { FeedItem } from \"./interfaces\";\n\nexport function deduplicateItems(items: FeedItem[]): FeedItem[] {\n const seen = {};\n const values: FeedItem[] = [];\n\n return items.reduce((acc, item) => {\n if (seen[item.id]) {\n return acc;\n }\n\n seen[item.id] = true;\n return [...acc, item];\n }, values);\n}\n\nexport function sortItems(items: FeedItem[]) {\n return items.sort((a, b) => {\n return (\n new Date(b.inserted_at).getTime() - new Date(a.inserted_at).getTime()\n );\n });\n}\n"],"file":"utils.js"}
@@ -1,2 +1,6 @@
1
1
  "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
2
6
  //# sourceMappingURL=interfaces.js.map
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, "FeedClient", {
14
+ Object.defineProperty(exports, "Feed", {
15
15
  enumerable: true,
16
16
  get: function get() {
17
- return _feed["default"];
17
+ return _feed.Feed;
18
18
  }
19
19
  });
20
- Object.defineProperty(exports, "Feed", {
20
+ Object.defineProperty(exports, "FeedClient", {
21
21
  enumerable: true,
22
22
  get: function get() {
23
- return _feed.Feed;
23
+ return _feed["default"];
24
24
  }
25
25
  });
26
26
  exports["default"] = void 0;
@@ -1,2 +1,6 @@
1
1
  "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
2
6
  //# sourceMappingURL=interfaces.js.map
@@ -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
 
@@ -66,4 +66,4 @@ class Knock {
66
66
  }
67
67
 
68
68
  export default Knock;
69
- //# sourceMappingURL=knock.js.map
69
+ //# sourceMappingURL=Knock.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/knock.ts"],"names":["ApiClient","FeedClient","Preferences","DEFAULT_HOST","Knock","constructor","apiKey","options","host","startsWith","Error","client","userId","userToken","console","warn","apiClient","authenticate","teardown","disconnectSocket"],"mappings":";AAAA,OAAOA,SAAP,MAAsB,OAAtB;AACA,OAAOC,UAAP,MAAuB,gBAAvB;AACA,OAAOC,WAAP,MAAwB,uBAAxB;AAGA,IAAMC,YAAY,GAAG,uBAArB;;AAEA,MAAMC,KAAN,CAAY;AASVC,EAAAA,WAAW,CAAUC,MAAV,EAAsD;AAAA,QAA5BC,OAA4B,uEAAJ,EAAI;AAAA,SAA5CD,MAA4C,GAA5CA,MAA4C;;AAAA;;AAAA;;AAAA,uCAN3B,IAM2B;;AAAA;;AAAA,mCAHhD,IAAIL,UAAJ,CAAe,IAAf,CAGgD;;AAAA,yCAF1C,IAAIC,WAAJ,CAAgB,IAAhB,CAE0C;;AAC/D,SAAKM,IAAL,GAAYD,OAAO,CAACC,IAAR,IAAgBL,YAA5B,CAD+D,CAG/D;;AACA,QAAI,KAAKG,MAAL,IAAe,KAAKA,MAAL,CAAYG,UAAZ,CAAuB,KAAvB,CAAnB,EAAkD;AAChD,YAAM,IAAIC,KAAJ,CACJ,qFADI,CAAN;AAGD;AACF;;AAEDC,EAAAA,MAAM,GAAG;AACP,QAAI,CAAC,KAAKC,MAAN,IAAgB,CAAC,KAAKC,SAA1B,EAAqC;AACnCC,MAAAA,OAAO,CAACC,IAAR;AAOD,KATM,CAWP;;;AACA,QAAI,CAAC,KAAKC,SAAV,EAAqB;AACnB,WAAKA,SAAL,GAAiB,IAAIhB,SAAJ,CAAc;AAC7BM,QAAAA,MAAM,EAAE,KAAKA,MADgB;AAE7BE,QAAAA,IAAI,EAAE,KAAKA,IAFkB;AAG7BK,QAAAA,SAAS,EAAE,KAAKA;AAHa,OAAd,CAAjB;AAKD;;AAED,WAAO,KAAKG,SAAZ;AACD;AAED;AACF;AACA;AACA;;;AACEC,EAAAA,YAAY,CAACL,MAAD,EAAiBC,SAAjB,EAAqC;AAC/C,SAAKD,MAAL,GAAcA,MAAd;AACA,SAAKC,SAAL,GAAiBA,SAAjB;AAEA;AACD,GApDS,CAsDV;;;AACAK,EAAAA,QAAQ,GAAG;AACT,QAAI,KAAKF,SAAT,EAAoB;AAClB,WAAKA,SAAL,CAAeG,gBAAf;AACD;AACF;;AA3DS;;AA8DZ,eAAef,KAAf","sourcesContent":["import ApiClient from \"./api\";\nimport FeedClient from \"./clients/feed\";\nimport Preferences from \"./clients/preferences\";\nimport { KnockOptions } from \"./interfaces\";\n\nconst DEFAULT_HOST = \"https://api.knock.app\";\n\nclass Knock {\n private host: string;\n private userToken: string | undefined;\n private apiClient: ApiClient | null = null;\n public userId: string | undefined;\n\n readonly feeds = new FeedClient(this);\n readonly preferences = new Preferences(this);\n\n constructor(readonly apiKey: string, options: KnockOptions = {}) {\n this.host = options.host || DEFAULT_HOST;\n\n // Fail loudly if we're using the wrong API key\n if (this.apiKey && this.apiKey.startsWith(\"sk_\")) {\n throw new Error(\n \"[Knock] You are using your secret API key on the client. Please use the public key.\",\n );\n }\n }\n\n client() {\n if (!this.userId && !this.userToken) {\n console.warn(\n `[Knock] You must call authenticate(userId, userToken) first before trying to make a request.\n Typically you'll see this message when you're creating a feed instance before having called\n authenticate with a user Id and token. That means we won't know who to issue the request\n to Knock on behalf of.\n `,\n );\n }\n\n // Initiate a new API client if we don't have one yet\n if (!this.apiClient) {\n this.apiClient = new ApiClient({\n apiKey: this.apiKey,\n host: this.host,\n userToken: this.userToken,\n });\n }\n\n return this.apiClient;\n }\n\n /*\n Authenticates the current user. In non-sandbox environments\n the userToken must be specified.\n */\n authenticate(userId: string, userToken?: string) {\n this.userId = userId;\n this.userToken = userToken;\n\n return;\n }\n\n // Used to teardown any connected instances\n teardown() {\n if (this.apiClient) {\n this.apiClient.disconnectSocket();\n }\n }\n}\n\nexport default Knock;\n"],"file":"knock.js"}
1
+ {"version":3,"sources":["../../src/Knock.ts"],"names":["ApiClient","FeedClient","Preferences","DEFAULT_HOST","Knock","constructor","apiKey","options","host","startsWith","Error","client","userId","userToken","console","warn","apiClient","authenticate","teardown","disconnectSocket"],"mappings":";AAAA,OAAOA,SAAP,MAAsB,OAAtB;AACA,OAAOC,UAAP,MAAuB,gBAAvB;AACA,OAAOC,WAAP,MAAwB,uBAAxB;AAGA,IAAMC,YAAY,GAAG,uBAArB;;AAEA,MAAMC,KAAN,CAAY;AASVC,EAAAA,WAAW,CAAUC,MAAV,EAAsD;AAAA,QAA5BC,OAA4B,uEAAJ,EAAI;AAAA,SAA5CD,MAA4C,GAA5CA,MAA4C;;AAAA;;AAAA;;AAAA,uCAN3B,IAM2B;;AAAA;;AAAA,mCAHhD,IAAIL,UAAJ,CAAe,IAAf,CAGgD;;AAAA,yCAF1C,IAAIC,WAAJ,CAAgB,IAAhB,CAE0C;;AAC/D,SAAKM,IAAL,GAAYD,OAAO,CAACC,IAAR,IAAgBL,YAA5B,CAD+D,CAG/D;;AACA,QAAI,KAAKG,MAAL,IAAe,KAAKA,MAAL,CAAYG,UAAZ,CAAuB,KAAvB,CAAnB,EAAkD;AAChD,YAAM,IAAIC,KAAJ,CACJ,qFADI,CAAN;AAGD;AACF;;AAEDC,EAAAA,MAAM,GAAG;AACP,QAAI,CAAC,KAAKC,MAAN,IAAgB,CAAC,KAAKC,SAA1B,EAAqC;AACnCC,MAAAA,OAAO,CAACC,IAAR;AAOD,KATM,CAWP;;;AACA,QAAI,CAAC,KAAKC,SAAV,EAAqB;AACnB,WAAKA,SAAL,GAAiB,IAAIhB,SAAJ,CAAc;AAC7BM,QAAAA,MAAM,EAAE,KAAKA,MADgB;AAE7BE,QAAAA,IAAI,EAAE,KAAKA,IAFkB;AAG7BK,QAAAA,SAAS,EAAE,KAAKA;AAHa,OAAd,CAAjB;AAKD;;AAED,WAAO,KAAKG,SAAZ;AACD;AAED;AACF;AACA;AACA;;;AACEC,EAAAA,YAAY,CAACL,MAAD,EAAiBC,SAAjB,EAAqC;AAC/C,SAAKD,MAAL,GAAcA,MAAd;AACA,SAAKC,SAAL,GAAiBA,SAAjB;AAEA;AACD,GApDS,CAsDV;;;AACAK,EAAAA,QAAQ,GAAG;AACT,QAAI,KAAKF,SAAT,EAAoB;AAClB,WAAKA,SAAL,CAAeG,gBAAf;AACD;AACF;;AA3DS;;AA8DZ,eAAef,KAAf","sourcesContent":["import ApiClient from \"./api\";\nimport FeedClient from \"./clients/feed\";\nimport Preferences from \"./clients/preferences\";\nimport { KnockOptions } from \"./interfaces\";\n\nconst DEFAULT_HOST = \"https://api.knock.app\";\n\nclass Knock {\n private host: string;\n private userToken: string | undefined;\n private apiClient: ApiClient | null = null;\n public userId: string | undefined;\n\n readonly feeds = new FeedClient(this);\n readonly preferences = new Preferences(this);\n\n constructor(readonly apiKey: string, options: KnockOptions = {}) {\n this.host = options.host || DEFAULT_HOST;\n\n // Fail loudly if we're using the wrong API key\n if (this.apiKey && this.apiKey.startsWith(\"sk_\")) {\n throw new Error(\n \"[Knock] You are using your secret API key on the client. Please use the public key.\",\n );\n }\n }\n\n client() {\n if (!this.userId && !this.userToken) {\n console.warn(\n `[Knock] You must call authenticate(userId, userToken) first before trying to make a request.\n Typically you'll see this message when you're creating a feed instance before having called\n authenticate with a user Id and token. That means we won't know who to issue the request\n to Knock on behalf of.\n `,\n );\n }\n\n // Initiate a new API client if we don't have one yet\n if (!this.apiClient) {\n this.apiClient = new ApiClient({\n apiKey: this.apiKey,\n host: this.host,\n userToken: this.userToken,\n });\n }\n\n return this.apiClient;\n }\n\n /*\n Authenticates the current user. In non-sandbox environments\n the userToken must be specified.\n */\n authenticate(userId: string, userToken?: string) {\n this.userId = userId;\n this.userToken = userToken;\n\n return;\n }\n\n // Used to teardown any connected instances\n teardown() {\n if (this.apiClient) {\n this.apiClient.disconnectSocket();\n }\n }\n}\n\nexport default Knock;\n"],"file":"Knock.js"}
package/dist/esm/api.js CHANGED
@@ -75,9 +75,8 @@ class ApiClient {
75
75
  body: result.data,
76
76
  error: undefined,
77
77
  status: result.status
78
- };
78
+ }; // eslint:disable-next-line
79
79
  } catch (e) {
80
- // tslint:disable-next-line
81
80
  console.error(e);
82
81
  return {
83
82
  statusCode: "error",
@@ -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":"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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 error?: any;\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: boolean = 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 } catch (e) {\n // tslint:disable-next-line\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
+ {"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); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
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] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
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 "eventemitter3";
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
- _this7.broadcast("messages.new", response);
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 currentHead = getState().items[0]; // Optimistically set the badge counts
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
  }
@@ -0,0 +1 @@
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"}
File without changes
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/clients/feed/index.ts"],"names":["Feed","FeedClient","constructor","instance","initialize","feedChannelId","options"],"mappings":";AACA,OAAOA,IAAP,MAAiB,QAAjB;;AAGA,MAAMC,UAAN,CAAiB;AAGfC,EAAAA,WAAW,CAACC,QAAD,EAAkB;AAAA;;AAC3B,SAAKA,QAAL,GAAgBA,QAAhB;AACD;;AAEDC,EAAAA,UAAU,CAACC,aAAD,EAAyD;AAAA,QAAjCC,OAAiC,uEAAJ,EAAI;AACjE,WAAO,IAAIN,IAAJ,CAAS,KAAKG,QAAd,EAAwBE,aAAxB,EAAuCC,OAAvC,CAAP;AACD;;AATc;;AAYjB,SAASN,IAAT;AACA,eAAeC,UAAf","sourcesContent":["import Knock from \"../../knock\";\nimport Feed from \"./feed\";\nimport { FeedClientOptions } from \"./interfaces\";\n\nclass FeedClient {\n private instance: Knock;\n\n constructor(instance: Knock) {\n this.instance = instance;\n }\n\n initialize(feedChannelId: string, options: FeedClientOptions = {}) {\n return new Feed(this.instance, feedChannelId, options);\n }\n}\n\nexport { Feed };\nexport default FeedClient;\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../../../src/clients/Feed/index.ts"],"names":["Feed","FeedClient","constructor","instance","initialize","feedChannelId","options"],"mappings":";AACA,OAAOA,IAAP,MAAiB,QAAjB;;AAGA,MAAMC,UAAN,CAAiB;AAGfC,EAAAA,WAAW,CAACC,QAAD,EAAkB;AAAA;;AAC3B,SAAKA,QAAL,GAAgBA,QAAhB;AACD;;AAEDC,EAAAA,UAAU,CAACC,aAAD,EAAyD;AAAA,QAAjCC,OAAiC,uEAAJ,EAAI;AACjE,WAAO,IAAIN,IAAJ,CAAS,KAAKG,QAAd,EAAwBE,aAAxB,EAAuCC,OAAvC,CAAP;AACD;;AATc;;AAYjB,SAASN,IAAT;AACA,eAAeC,UAAf","sourcesContent":["import Knock from \"../../knock\";\nimport Feed from \"./feed\";\nimport { FeedClientOptions } from \"./interfaces\";\n\nclass FeedClient {\n private instance: Knock;\n\n constructor(instance: Knock) {\n this.instance = instance;\n }\n\n initialize(feedChannelId: string, options: FeedClientOptions = {}) {\n return new Feed(this.instance, feedChannelId, options);\n }\n}\n\nexport { Feed };\nexport default FeedClient;\n"],"file":"index.js"}
@@ -0,0 +1,2 @@
1
+ export {};
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); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
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] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
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":"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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 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
+ {"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":"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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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
File without changes
File without changes
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/clients/feed/utils.ts"],"names":["deduplicateItems","items","seen","values","reduce","acc","item","id","sortItems","sort","a","b","Date","inserted_at","getTime"],"mappings":"AAEA,OAAO,SAASA,gBAAT,CAA0BC,KAA1B,EAAyD;AAC9D,MAAMC,IAAI,GAAG,EAAb;AACA,MAAMC,MAAkB,GAAG,EAA3B;AAEA,SAAOF,KAAK,CAACG,MAAN,CAAa,CAACC,GAAD,EAAMC,IAAN,KAAe;AACjC,QAAIJ,IAAI,CAACI,IAAI,CAACC,EAAN,CAAR,EAAmB;AACjB,aAAOF,GAAP;AACD;;AAEDH,IAAAA,IAAI,CAACI,IAAI,CAACC,EAAN,CAAJ,GAAgB,IAAhB;AACA,WAAO,CAAC,GAAGF,GAAJ,EAASC,IAAT,CAAP;AACD,GAPM,EAOJH,MAPI,CAAP;AAQD;AAED,OAAO,SAASK,SAAT,CAAmBP,KAAnB,EAAsC;AAC3C,SAAOA,KAAK,CAACQ,IAAN,CAAW,CAACC,CAAD,EAAIC,CAAJ,KAAU;AAC1B,WACE,IAAIC,IAAJ,CAASD,CAAC,CAACE,WAAX,EAAwBC,OAAxB,KAAoC,IAAIF,IAAJ,CAASF,CAAC,CAACG,WAAX,EAAwBC,OAAxB,EADtC;AAGD,GAJM,CAAP;AAKD","sourcesContent":["import { FeedItem } from \"./interfaces\";\n\nexport function deduplicateItems(items: FeedItem[]): FeedItem[] {\n const seen = {};\n const values: FeedItem[] = [];\n\n return items.reduce((acc, item) => {\n if (seen[item.id]) {\n return acc;\n }\n\n seen[item.id] = true;\n return [...acc, item];\n }, values);\n}\n\nexport function sortItems(items: FeedItem[]) {\n return items.sort((a, b) => {\n return (\n new Date(b.inserted_at).getTime() - new Date(a.inserted_at).getTime()\n );\n });\n}\n"],"file":"utils.js"}
1
+ {"version":3,"sources":["../../../../src/clients/Feed/utils.ts"],"names":["deduplicateItems","items","seen","values","reduce","acc","item","id","sortItems","sort","a","b","Date","inserted_at","getTime"],"mappings":"AAEA,OAAO,SAASA,gBAAT,CAA0BC,KAA1B,EAAyD;AAC9D,MAAMC,IAAI,GAAG,EAAb;AACA,MAAMC,MAAkB,GAAG,EAA3B;AAEA,SAAOF,KAAK,CAACG,MAAN,CAAa,CAACC,GAAD,EAAMC,IAAN,KAAe;AACjC,QAAIJ,IAAI,CAACI,IAAI,CAACC,EAAN,CAAR,EAAmB;AACjB,aAAOF,GAAP;AACD;;AAEDH,IAAAA,IAAI,CAACI,IAAI,CAACC,EAAN,CAAJ,GAAgB,IAAhB;AACA,WAAO,CAAC,GAAGF,GAAJ,EAASC,IAAT,CAAP;AACD,GAPM,EAOJH,MAPI,CAAP;AAQD;AAED,OAAO,SAASK,SAAT,CAAmBP,KAAnB,EAAsC;AAC3C,SAAOA,KAAK,CAACQ,IAAN,CAAW,CAACC,CAAD,EAAIC,CAAJ,KAAU;AAC1B,WACE,IAAIC,IAAJ,CAASD,CAAC,CAACE,WAAX,EAAwBC,OAAxB,KAAoC,IAAIF,IAAJ,CAASF,CAAC,CAACG,WAAX,EAAwBC,OAAxB,EADtC;AAGD,GAJM,CAAP;AAKD","sourcesContent":["import { FeedItem } from \"./interfaces\";\n\nexport function deduplicateItems(items: FeedItem[]): FeedItem[] {\n const seen = {};\n const values: FeedItem[] = [];\n\n return items.reduce((acc, item) => {\n if (seen[item.id]) {\n return acc;\n }\n\n seen[item.id] = true;\n return [...acc, item];\n }, values);\n}\n\nexport function sortItems(items: FeedItem[]) {\n return items.sort((a, b) => {\n return (\n new Date(b.inserted_at).getTime() - new Date(a.inserted_at).getTime()\n );\n });\n}\n"],"file":"utils.js"}
@@ -1,2 +1,2 @@
1
-
1
+ export {};
2
2
  //# sourceMappingURL=interfaces.js.map
@@ -1,2 +1,2 @@
1
-
1
+ export {};
2
2
  //# sourceMappingURL=interfaces.js.map
@@ -16,4 +16,4 @@ declare class Knock {
16
16
  teardown(): void;
17
17
  }
18
18
  export default Knock;
19
- //# sourceMappingURL=knock.d.ts.map
19
+ //# sourceMappingURL=Knock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"knock.d.ts","sourceRoot":"","sources":["../../src/knock.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,OAAO,CAAC;AAC9B,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAI5C,cAAM,KAAK;IASG,QAAQ,CAAC,MAAM,EAAE,MAAM;IARnC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,SAAS,CAA0B;IACpC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAElC,QAAQ,CAAC,KAAK,aAAwB;IACtC,QAAQ,CAAC,WAAW,cAAyB;gBAExB,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB;IAW/D,MAAM;IA2BN,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAQ/C,QAAQ;CAKT;AAED,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Knock.d.ts","sourceRoot":"","sources":["../../src/Knock.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,OAAO,CAAC;AAC9B,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAI5C,cAAM,KAAK;IASG,QAAQ,CAAC,MAAM,EAAE,MAAM;IARnC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,SAAS,CAA0B;IACpC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAElC,QAAQ,CAAC,KAAK,aAAwB;IACtC,QAAQ,CAAC,WAAW,cAAyB;gBAExB,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB;IAW/D,MAAM;IA2BN,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAQ/C,QAAQ;CAKT;AAED,eAAe,KAAK,CAAC"}
@@ -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;IAC1B,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,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,EAAE,OAAO,CAAS;gBAE5B,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;IAuBhE,OAAO,CAAC,eAAe;CAuBxB;AAED,eAAe,SAAS,CAAC"}
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 { FeedRealTimeEvent, FeedItemOrItems, FeedStoreState } from "./types";
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: FeedRealTimeEvent, callback: () => void): void;
19
- off(eventName: FeedRealTimeEvent, callback: () => void): void;
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,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;IA0C3C,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,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: GenericData;
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;CACjE,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;IACvB,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,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,WAAW,CAAC;IAClB,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
+ {"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,uDAyElC"}
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;AAEF,oBAAY,iBAAiB,GAAG,cAAc,CAAC;AAE/C,oBAAY,eAAe,GAAG,QAAQ,GAAG,QAAQ,EAAE,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("../..").JsonObject>[];
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,cAM1C"}
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,0CAM1C"}
@@ -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
- email: boolean;
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":"AAAA,oBAAY,WAAW,GAAG,OAAO,GAAG,aAAa,CAAC;AAElD,oBAAY,sBAAsB,GAAG;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;CACtB,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
+ {"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,9 +1,12 @@
1
+ export declare type JsonValue = string | number | boolean | JsonObject | JsonArray | null | undefined;
2
+ export interface JsonObject {
3
+ [x: string]: JsonValue;
4
+ }
5
+ export declare type JsonArray = Array<JsonValue>;
1
6
  export interface KnockOptions {
2
7
  host?: string;
3
8
  }
4
- export interface GenericData {
5
- [key: string]: any;
6
- }
9
+ export declare type GenericData = JsonObject;
7
10
  export interface User extends GenericData {
8
11
  id: string;
9
12
  email: 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;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;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"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,UAAU,GACV,SAAS,GACT,IAAI,GACJ,SAAS,CAAC;AAEd,MAAM,WAAW,UAAU;IACzB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxB;AAED,oBAAY,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAEzC,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAGD,oBAAY,WAAW,GAAG,UAAU,CAAC;AAErC,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",
3
+ "version": "0.5.4",
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": "tslint -p tsconfig.json -c tslint.json",
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,25 +41,27 @@
41
41
  "prepublishOnly": "npm run build"
42
42
  },
43
43
  "devDependencies": {
44
- "@babel/cli": "^7.13.16",
45
- "@babel/core": "^7.14.0",
46
- "@babel/plugin-proposal-class-properties": "^7.13.0",
47
- "@babel/plugin-proposal-object-rest-spread": "^7.13.8",
48
- "@babel/plugin-transform-runtime": "^7.13.15",
49
- "@babel/preset-env": "^7.14.1",
50
- "@babel/preset-typescript": "^7.13.0",
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
- "eventemitter3": "^4.0.7",
64
+ "eventemitter2": "^6.4.5",
63
65
  "phoenix": "1.5.8",
64
66
  "zustand": "^3.5.10"
65
67
  }
@@ -1 +0,0 @@
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,2 +0,0 @@
1
- "use strict";
2
- //# sourceMappingURL=interfaces.js.map
@@ -1,2 +0,0 @@
1
- "use strict";
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
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,2 +0,0 @@
1
-
2
- //# sourceMappingURL=interfaces.js.map
@@ -1,2 +0,0 @@
1
-
2
- //# sourceMappingURL=types.js.map