@knocklabs/client 0.4.5-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +174 -0
- package/dist/cjs/api.js +165 -0
- package/dist/cjs/api.js.map +1 -0
- package/dist/cjs/clients/feed/feed.js +557 -0
- package/dist/cjs/clients/feed/feed.js.map +1 -0
- package/dist/cjs/clients/feed/index.js +43 -0
- package/dist/cjs/clients/feed/index.js.map +1 -0
- package/dist/cjs/clients/feed/interfaces.js +2 -0
- package/dist/cjs/clients/feed/interfaces.js.map +1 -0
- package/dist/cjs/clients/feed/store.js +115 -0
- package/dist/cjs/clients/feed/store.js.map +1 -0
- package/dist/cjs/clients/feed/types.js +2 -0
- package/dist/cjs/clients/feed/types.js.map +1 -0
- package/dist/cjs/clients/feed/utils.js +31 -0
- package/dist/cjs/clients/feed/utils.js.map +1 -0
- package/dist/cjs/clients/preferences/index.js +406 -0
- package/dist/cjs/clients/preferences/index.js.map +1 -0
- package/dist/cjs/clients/preferences/interfaces.js +2 -0
- package/dist/cjs/clients/preferences/interfaces.js.map +1 -0
- package/dist/cjs/index.js +108 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/interfaces.js +2 -0
- package/dist/cjs/interfaces.js.map +1 -0
- package/dist/cjs/knock.js +86 -0
- package/dist/cjs/knock.js.map +1 -0
- package/dist/cjs/networkStatus.js +21 -0
- package/dist/cjs/networkStatus.js.map +1 -0
- package/dist/esm/api.js +119 -0
- package/dist/esm/api.js.map +1 -0
- package/dist/esm/clients/feed/feed.js +337 -0
- package/dist/esm/clients/feed/feed.js.map +1 -0
- package/dist/esm/clients/feed/index.js +20 -0
- package/dist/esm/clients/feed/index.js.map +1 -0
- package/dist/esm/clients/feed/interfaces.js +2 -0
- package/dist/esm/clients/feed/interfaces.js.map +1 -0
- package/dist/esm/clients/feed/store.js +91 -0
- package/dist/esm/clients/feed/store.js.map +1 -0
- package/dist/esm/clients/feed/types.js +2 -0
- package/dist/esm/clients/feed/types.js.map +1 -0
- package/dist/esm/clients/feed/utils.js +18 -0
- package/dist/esm/clients/feed/utils.js.map +1 -0
- package/dist/esm/clients/preferences/index.js +176 -0
- package/dist/esm/clients/preferences/index.js.map +1 -0
- package/dist/esm/clients/preferences/interfaces.js +2 -0
- package/dist/esm/clients/preferences/interfaces.js.map +1 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/interfaces.js +2 -0
- package/dist/esm/interfaces.js.map +1 -0
- package/dist/esm/knock.js +69 -0
- package/dist/esm/knock.js.map +1 -0
- package/dist/esm/networkStatus.js +13 -0
- package/dist/esm/networkStatus.js.map +1 -0
- package/dist/types/api.d.ts +28 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/clients/feed/feed.d.ts +46 -0
- package/dist/types/clients/feed/feed.d.ts.map +1 -0
- package/dist/types/clients/feed/index.d.ts +11 -0
- package/dist/types/clients/feed/index.d.ts.map +1 -0
- package/dist/types/clients/feed/interfaces.d.ts +50 -0
- package/dist/types/clients/feed/interfaces.d.ts.map +1 -0
- package/dist/types/clients/feed/store.d.ts +3 -0
- package/dist/types/clients/feed/store.d.ts.map +1 -0
- package/dist/types/clients/feed/types.d.ts +25 -0
- package/dist/types/clients/feed/types.d.ts.map +1 -0
- package/dist/types/clients/feed/utils.d.ts +4 -0
- package/dist/types/clients/feed/utils.d.ts.map +1 -0
- package/dist/types/clients/preferences/index.d.ts +18 -0
- package/dist/types/clients/preferences/index.d.ts.map +1 -0
- package/dist/types/clients/preferences/interfaces.d.ts +26 -0
- package/dist/types/clients/preferences/interfaces.d.ts.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/interfaces.d.ts +27 -0
- package/dist/types/interfaces.d.ts.map +1 -0
- package/dist/types/knock.d.ts +19 -0
- package/dist/types/knock.d.ts.map +1 -0
- package/dist/types/networkStatus.d.ts +8 -0
- package/dist/types/networkStatus.d.ts.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/clients/preferences/index.ts"],"names":["DEFAULT_PREFERENCE_SET_ID","buildUpdateParam","param","subscribed","Preferences","instance","client","makeRequest","method","url","userId","result","handleResponse","options","preferenceSetId","preferenceSet","data","channelTypePreferences","channelType","setting","workflowPreferences","workflowKey","params","categoryPreferences","categoryKey","response","statusCode","Error","error","body"],"mappings":"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","sourcesContent":["import { ApiResponse } from \"../../api\";\nimport Knock from \"../../knock\";\nimport {\n ChannelTypePreferences,\n ChannelType,\n PreferenceOptions,\n SetPreferencesProperties,\n WorkflowPreferenceSetting,\n WorkflowPreferences,\n PreferenceSet,\n} from \"./interfaces\";\n\nconst DEFAULT_PREFERENCE_SET_ID = \"default\";\n\nfunction buildUpdateParam(param: WorkflowPreferenceSetting) {\n if (typeof param === \"object\") {\n return param;\n }\n\n return { subscribed: param };\n}\n\nclass Preferences {\n private instance: Knock;\n\n constructor(instance: Knock) {\n this.instance = instance;\n }\n\n async getAll() {\n const result = await this.instance.client().makeRequest({\n method: \"GET\",\n url: `/v1/users/${this.instance.userId}/preferences`,\n });\n\n return this.handleResponse(result);\n }\n\n async get(options: PreferenceOptions = {}) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n\n const result = await this.instance.client().makeRequest({\n method: \"GET\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}`,\n });\n\n return this.handleResponse(result);\n }\n\n async set(\n preferenceSet: SetPreferencesProperties,\n options: PreferenceOptions = {},\n ) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}`,\n data: preferenceSet,\n });\n\n return this.handleResponse(result);\n }\n\n async setChannelTypes(\n channelTypePreferences: ChannelTypePreferences,\n options: PreferenceOptions = {},\n ) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}/channel_types`,\n data: channelTypePreferences,\n });\n\n return this.handleResponse(result);\n }\n\n async setChannelType(\n channelType: ChannelType,\n setting: boolean,\n options: PreferenceOptions = {},\n ) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}/channel_types/${channelType}`,\n data: { subscribed: setting },\n });\n\n return this.handleResponse(result);\n }\n\n async setWorkflows(\n workflowPreferences: WorkflowPreferences,\n options: PreferenceOptions = {},\n ) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}/workflows`,\n data: workflowPreferences,\n });\n\n return this.handleResponse(result);\n }\n\n async setWorkflow(\n workflowKey: string,\n setting: WorkflowPreferenceSetting,\n options: PreferenceOptions = {},\n ) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n const params = buildUpdateParam(setting);\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}/workflows/${workflowKey}`,\n data: params,\n });\n\n return this.handleResponse(result);\n }\n\n async setCategories(\n categoryPreferences: WorkflowPreferences,\n options: PreferenceOptions = {},\n ) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}/categories`,\n data: categoryPreferences,\n });\n\n return this.handleResponse(result);\n }\n\n async setCategory(\n categoryKey: string,\n setting: WorkflowPreferenceSetting,\n options: PreferenceOptions = {},\n ) {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n const params = buildUpdateParam(setting);\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}/categories/${categoryKey}`,\n data: params,\n });\n\n return this.handleResponse(result);\n }\n\n private handleResponse(response: ApiResponse) {\n if (response.statusCode === \"error\") {\n throw new Error(response.error || response.body);\n }\n\n return response.body as PreferenceSet;\n }\n}\n\nexport default Preferences;\n"],"file":"index.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"interfaces.js"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "__esModule", {
|
|
8
|
+
value: true
|
|
9
|
+
});
|
|
10
|
+
var _exportNames = {
|
|
11
|
+
FeedClient: true,
|
|
12
|
+
Feed: true
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "FeedClient", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function get() {
|
|
17
|
+
return _feed["default"];
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
Object.defineProperty(exports, "Feed", {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
get: function get() {
|
|
23
|
+
return _feed.Feed;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
exports["default"] = void 0;
|
|
27
|
+
|
|
28
|
+
var _knock = _interopRequireDefault(require("./knock"));
|
|
29
|
+
|
|
30
|
+
var _feed = _interopRequireWildcard(require("./clients/feed"));
|
|
31
|
+
|
|
32
|
+
var _interfaces = require("./interfaces");
|
|
33
|
+
|
|
34
|
+
Object.keys(_interfaces).forEach(function (key) {
|
|
35
|
+
if (key === "default" || key === "__esModule") return;
|
|
36
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
37
|
+
if (key in exports && exports[key] === _interfaces[key]) return;
|
|
38
|
+
Object.defineProperty(exports, key, {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
get: function get() {
|
|
41
|
+
return _interfaces[key];
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
var _types = require("./clients/feed/types");
|
|
47
|
+
|
|
48
|
+
Object.keys(_types).forEach(function (key) {
|
|
49
|
+
if (key === "default" || key === "__esModule") return;
|
|
50
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
51
|
+
if (key in exports && exports[key] === _types[key]) return;
|
|
52
|
+
Object.defineProperty(exports, key, {
|
|
53
|
+
enumerable: true,
|
|
54
|
+
get: function get() {
|
|
55
|
+
return _types[key];
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
var _interfaces2 = require("./clients/feed/interfaces");
|
|
61
|
+
|
|
62
|
+
Object.keys(_interfaces2).forEach(function (key) {
|
|
63
|
+
if (key === "default" || key === "__esModule") return;
|
|
64
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
65
|
+
if (key in exports && exports[key] === _interfaces2[key]) return;
|
|
66
|
+
Object.defineProperty(exports, key, {
|
|
67
|
+
enumerable: true,
|
|
68
|
+
get: function get() {
|
|
69
|
+
return _interfaces2[key];
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
var _interfaces3 = require("./clients/preferences/interfaces");
|
|
75
|
+
|
|
76
|
+
Object.keys(_interfaces3).forEach(function (key) {
|
|
77
|
+
if (key === "default" || key === "__esModule") return;
|
|
78
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
79
|
+
if (key in exports && exports[key] === _interfaces3[key]) return;
|
|
80
|
+
Object.defineProperty(exports, key, {
|
|
81
|
+
enumerable: true,
|
|
82
|
+
get: function get() {
|
|
83
|
+
return _interfaces3[key];
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
var _networkStatus = require("./networkStatus");
|
|
89
|
+
|
|
90
|
+
Object.keys(_networkStatus).forEach(function (key) {
|
|
91
|
+
if (key === "default" || key === "__esModule") return;
|
|
92
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
93
|
+
if (key in exports && exports[key] === _networkStatus[key]) return;
|
|
94
|
+
Object.defineProperty(exports, key, {
|
|
95
|
+
enumerable: true,
|
|
96
|
+
get: function get() {
|
|
97
|
+
return _networkStatus[key];
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
103
|
+
|
|
104
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
105
|
+
|
|
106
|
+
var _default = _knock["default"];
|
|
107
|
+
exports["default"] = _default;
|
|
108
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"names":["Knock"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAEA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;eAEeA,iB","sourcesContent":["import Knock from \"./knock\";\nimport FeedClient, { Feed } from \"./clients/feed\";\n\nexport * from \"./interfaces\";\nexport * from \"./clients/feed/types\";\nexport * from \"./clients/feed/interfaces\";\nexport * from \"./clients/preferences/interfaces\";\nexport * from \"./networkStatus\";\n\nexport default Knock;\nexport { Feed, FeedClient };\n"],"file":"index.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"interfaces.js"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
|
|
10
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
11
|
+
|
|
12
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
13
|
+
|
|
14
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
15
|
+
|
|
16
|
+
var _api = _interopRequireDefault(require("./api"));
|
|
17
|
+
|
|
18
|
+
var _feed = _interopRequireDefault(require("./clients/feed"));
|
|
19
|
+
|
|
20
|
+
var _preferences = _interopRequireDefault(require("./clients/preferences"));
|
|
21
|
+
|
|
22
|
+
var DEFAULT_HOST = "https://api.knock.app";
|
|
23
|
+
|
|
24
|
+
var Knock = /*#__PURE__*/function () {
|
|
25
|
+
function Knock(apiKey) {
|
|
26
|
+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
27
|
+
(0, _classCallCheck2["default"])(this, Knock);
|
|
28
|
+
this.apiKey = apiKey;
|
|
29
|
+
(0, _defineProperty2["default"])(this, "host", void 0);
|
|
30
|
+
(0, _defineProperty2["default"])(this, "userToken", void 0);
|
|
31
|
+
(0, _defineProperty2["default"])(this, "apiClient", null);
|
|
32
|
+
(0, _defineProperty2["default"])(this, "userId", void 0);
|
|
33
|
+
(0, _defineProperty2["default"])(this, "feeds", new _feed["default"](this));
|
|
34
|
+
(0, _defineProperty2["default"])(this, "preferences", new _preferences["default"](this));
|
|
35
|
+
this.host = options.host || DEFAULT_HOST; // Fail loudly if we're using the wrong API key
|
|
36
|
+
|
|
37
|
+
if (this.apiKey && this.apiKey.startsWith("sk_")) {
|
|
38
|
+
throw new Error("[Knock] You are using your secret API key on the client. Please use the public key.");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
(0, _createClass2["default"])(Knock, [{
|
|
43
|
+
key: "client",
|
|
44
|
+
value: function client() {
|
|
45
|
+
if (!this.userId && !this.userToken) {
|
|
46
|
+
console.warn("[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 ");
|
|
47
|
+
} // Initiate a new API client if we don't have one yet
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
if (!this.apiClient) {
|
|
51
|
+
this.apiClient = new _api["default"]({
|
|
52
|
+
apiKey: this.apiKey,
|
|
53
|
+
host: this.host,
|
|
54
|
+
userToken: this.userToken
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return this.apiClient;
|
|
59
|
+
}
|
|
60
|
+
/*
|
|
61
|
+
Authenticates the current user. In non-sandbox environments
|
|
62
|
+
the userToken must be specified.
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
}, {
|
|
66
|
+
key: "authenticate",
|
|
67
|
+
value: function authenticate(userId, userToken) {
|
|
68
|
+
this.userId = userId;
|
|
69
|
+
this.userToken = userToken;
|
|
70
|
+
return;
|
|
71
|
+
} // Used to teardown any connected instances
|
|
72
|
+
|
|
73
|
+
}, {
|
|
74
|
+
key: "teardown",
|
|
75
|
+
value: function teardown() {
|
|
76
|
+
if (this.apiClient) {
|
|
77
|
+
this.apiClient.disconnectSocket();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}]);
|
|
81
|
+
return Knock;
|
|
82
|
+
}();
|
|
83
|
+
|
|
84
|
+
var _default = Knock;
|
|
85
|
+
exports["default"] = _default;
|
|
86
|
+
//# sourceMappingURL=knock.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.isRequestInFlight = isRequestInFlight;
|
|
7
|
+
exports.NetworkStatus = void 0;
|
|
8
|
+
var NetworkStatus;
|
|
9
|
+
exports.NetworkStatus = NetworkStatus;
|
|
10
|
+
|
|
11
|
+
(function (NetworkStatus) {
|
|
12
|
+
NetworkStatus["loading"] = "loading";
|
|
13
|
+
NetworkStatus["fetchMore"] = "fetchMore";
|
|
14
|
+
NetworkStatus["ready"] = "ready";
|
|
15
|
+
NetworkStatus["error"] = "error";
|
|
16
|
+
})(NetworkStatus || (exports.NetworkStatus = NetworkStatus = {}));
|
|
17
|
+
|
|
18
|
+
function isRequestInFlight(networkStatus) {
|
|
19
|
+
return [NetworkStatus.loading, NetworkStatus.fetchMore].includes(networkStatus);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=networkStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/networkStatus.ts"],"names":["NetworkStatus","isRequestInFlight","networkStatus","loading","fetchMore","includes"],"mappings":";;;;;;;IAAYA,a;;;WAAAA,a;AAAAA,EAAAA,a;AAAAA,EAAAA,a;AAAAA,EAAAA,a;AAAAA,EAAAA,a;GAAAA,a,6BAAAA,a;;AAcL,SAASC,iBAAT,CAA2BC,aAA3B,EAAkE;AACvE,SAAO,CAACF,aAAa,CAACG,OAAf,EAAwBH,aAAa,CAACI,SAAtC,EAAiDC,QAAjD,CACLH,aADK,CAAP;AAGD","sourcesContent":["export enum NetworkStatus {\n // Performing a top level loading operation\n loading = \"loading\",\n\n // Performing a fetch more on some already loaded data\n fetchMore = \"fetchMore\",\n\n // No operation is currently in progress\n ready = \"ready\",\n\n // The last operation failed with an error\n error = \"error\",\n}\n\nexport function isRequestInFlight(networkStatus: NetworkStatus): boolean {\n return [NetworkStatus.loading, NetworkStatus.fetchMore].includes(\n networkStatus,\n );\n}\n"],"file":"networkStatus.js"}
|
package/dist/esm/api.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
|
+
import axios from "axios";
|
|
4
|
+
import axiosRetry from "axios-retry";
|
|
5
|
+
import { Socket } from "phoenix";
|
|
6
|
+
|
|
7
|
+
class ApiClient {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
_defineProperty(this, "host", void 0);
|
|
10
|
+
|
|
11
|
+
_defineProperty(this, "apiKey", void 0);
|
|
12
|
+
|
|
13
|
+
_defineProperty(this, "userToken", void 0);
|
|
14
|
+
|
|
15
|
+
_defineProperty(this, "axiosClient", void 0);
|
|
16
|
+
|
|
17
|
+
_defineProperty(this, "socket", void 0);
|
|
18
|
+
|
|
19
|
+
_defineProperty(this, "socketConnected", false);
|
|
20
|
+
|
|
21
|
+
this.host = options.host;
|
|
22
|
+
this.apiKey = options.apiKey;
|
|
23
|
+
this.userToken = options.userToken || null; // Create a retryable axios client
|
|
24
|
+
|
|
25
|
+
this.axiosClient = axios.create({
|
|
26
|
+
baseURL: this.host,
|
|
27
|
+
headers: {
|
|
28
|
+
Accept: "application/json",
|
|
29
|
+
"Content-Type": "application/json",
|
|
30
|
+
Authorization: "Bearer ".concat(this.apiKey),
|
|
31
|
+
"X-Knock-User-Token": this.userToken
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
this.socket = new Socket("".concat(this.host.replace("http", "ws"), "/ws/v1"), {
|
|
35
|
+
params: {
|
|
36
|
+
user_token: this.userToken,
|
|
37
|
+
api_key: this.apiKey
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
axiosRetry(this.axiosClient, {
|
|
41
|
+
retries: 3,
|
|
42
|
+
retryCondition: this.canRetryRequest,
|
|
43
|
+
retryDelay: axiosRetry.exponentialDelay
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
connectSocket() {
|
|
48
|
+
if (this.socketConnected) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
this.socket.connect();
|
|
53
|
+
this.socket.onOpen(() => {
|
|
54
|
+
this.socketConnected = true;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
disconnectSocket() {
|
|
59
|
+
this.socket.disconnect();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
createChannel(name, params) {
|
|
64
|
+
return this.socket.channel(name, params);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
makeRequest(req) {
|
|
68
|
+
var _this = this;
|
|
69
|
+
|
|
70
|
+
return _asyncToGenerator(function* () {
|
|
71
|
+
try {
|
|
72
|
+
var result = yield _this.axiosClient(req);
|
|
73
|
+
return {
|
|
74
|
+
statusCode: result.status < 300 ? "ok" : "error",
|
|
75
|
+
body: result.data,
|
|
76
|
+
error: undefined,
|
|
77
|
+
status: result.status
|
|
78
|
+
};
|
|
79
|
+
} catch (e) {
|
|
80
|
+
// tslint:disable-next-line
|
|
81
|
+
console.error(e);
|
|
82
|
+
return {
|
|
83
|
+
statusCode: "error",
|
|
84
|
+
status: 500,
|
|
85
|
+
body: undefined,
|
|
86
|
+
error: e
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
})();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
canRetryRequest(error) {
|
|
93
|
+
// Retry Network Errors.
|
|
94
|
+
if (axiosRetry.isNetworkError(error)) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (!error.response) {
|
|
99
|
+
// Cannot determine if the request can be retried
|
|
100
|
+
return false;
|
|
101
|
+
} // Retry Server Errors (5xx).
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
if (error.response.status >= 500 && error.response.status <= 599) {
|
|
105
|
+
return true;
|
|
106
|
+
} // Retry if rate limited.
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
if (error.response.status === 429) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export default ApiClient;
|
|
119
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
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; }
|
|
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; }
|
|
7
|
+
|
|
8
|
+
import EventEmitter from "eventemitter3";
|
|
9
|
+
import createStore from "./store";
|
|
10
|
+
import { isRequestInFlight, NetworkStatus } from "../../networkStatus";
|
|
11
|
+
|
|
12
|
+
class Feed {
|
|
13
|
+
// The raw store instance, used for binding in React and other environments
|
|
14
|
+
constructor(knock, feedId, options) {
|
|
15
|
+
this.knock = knock;
|
|
16
|
+
this.feedId = feedId;
|
|
17
|
+
|
|
18
|
+
_defineProperty(this, "apiClient", void 0);
|
|
19
|
+
|
|
20
|
+
_defineProperty(this, "userFeedId", void 0);
|
|
21
|
+
|
|
22
|
+
_defineProperty(this, "channelConnected", false);
|
|
23
|
+
|
|
24
|
+
_defineProperty(this, "channel", void 0);
|
|
25
|
+
|
|
26
|
+
_defineProperty(this, "broadcaster", void 0);
|
|
27
|
+
|
|
28
|
+
_defineProperty(this, "defaultOptions", void 0);
|
|
29
|
+
|
|
30
|
+
_defineProperty(this, "store", void 0);
|
|
31
|
+
|
|
32
|
+
this.apiClient = knock.client();
|
|
33
|
+
this.feedId = feedId;
|
|
34
|
+
this.userFeedId = this.buildUserFeedId();
|
|
35
|
+
this.store = createStore();
|
|
36
|
+
this.broadcaster = new EventEmitter();
|
|
37
|
+
this.defaultOptions = options; // Try and connect to the socket
|
|
38
|
+
|
|
39
|
+
this.apiClient.connectSocket();
|
|
40
|
+
this.channel = this.apiClient.createChannel("feeds:".concat(this.userFeedId), this.defaultOptions);
|
|
41
|
+
}
|
|
42
|
+
/*
|
|
43
|
+
Returns a socket to listen for feed updates
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
listenForUpdates() {
|
|
48
|
+
if (!this.channelConnected) {
|
|
49
|
+
this.channel.join().receive("ok", () => {
|
|
50
|
+
this.channelConnected = true;
|
|
51
|
+
});
|
|
52
|
+
this.channel.on("new-message", resp => this.onNewMessageReceived(resp));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return () => {
|
|
56
|
+
try {
|
|
57
|
+
this.channel.leave();
|
|
58
|
+
} catch (e) {
|
|
59
|
+
// tslint:disable-next-line
|
|
60
|
+
console.error("error while leaving channel", e);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/* Binds a handler to be invoked when event occurs */
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
on(eventName, callback) {
|
|
68
|
+
this.broadcaster.on(eventName, callback);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
off(eventName, callback) {
|
|
72
|
+
this.broadcaster.off(eventName, callback);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
getState() {
|
|
76
|
+
return this.store.getState();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
markAsSeen(itemOrItems) {
|
|
80
|
+
var _this = this;
|
|
81
|
+
|
|
82
|
+
return _asyncToGenerator(function* () {
|
|
83
|
+
var now = new Date().toISOString();
|
|
84
|
+
|
|
85
|
+
_this.optimisticallyPerformStatusUpdate(itemOrItems, "seen", {
|
|
86
|
+
seen_at: now
|
|
87
|
+
}, "unseen_count");
|
|
88
|
+
|
|
89
|
+
return _this.makeStatusUpdate(itemOrItems, "seen");
|
|
90
|
+
})();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
markAsUnseen(itemOrItems) {
|
|
94
|
+
var _this2 = this;
|
|
95
|
+
|
|
96
|
+
return _asyncToGenerator(function* () {
|
|
97
|
+
_this2.optimisticallyPerformStatusUpdate(itemOrItems, "unseen", {
|
|
98
|
+
seen_at: null
|
|
99
|
+
}, "unseen_count");
|
|
100
|
+
|
|
101
|
+
return _this2.makeStatusUpdate(itemOrItems, "unseen");
|
|
102
|
+
})();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
markAsRead(itemOrItems) {
|
|
106
|
+
var _this3 = this;
|
|
107
|
+
|
|
108
|
+
return _asyncToGenerator(function* () {
|
|
109
|
+
var now = new Date().toISOString();
|
|
110
|
+
|
|
111
|
+
_this3.optimisticallyPerformStatusUpdate(itemOrItems, "read", {
|
|
112
|
+
read_at: now
|
|
113
|
+
}, "unread_count");
|
|
114
|
+
|
|
115
|
+
return _this3.makeStatusUpdate(itemOrItems, "read");
|
|
116
|
+
})();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
markAsUnread(itemOrItems) {
|
|
120
|
+
var _this4 = this;
|
|
121
|
+
|
|
122
|
+
return _asyncToGenerator(function* () {
|
|
123
|
+
_this4.optimisticallyPerformStatusUpdate(itemOrItems, "unread", {
|
|
124
|
+
read_at: null
|
|
125
|
+
}, "unread_count");
|
|
126
|
+
|
|
127
|
+
return _this4.makeStatusUpdate(itemOrItems, "unread");
|
|
128
|
+
})();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
markAsArchived(itemOrItems) {
|
|
132
|
+
var _this5 = this;
|
|
133
|
+
|
|
134
|
+
return _asyncToGenerator(function* () {
|
|
135
|
+
var now = new Date().toISOString();
|
|
136
|
+
|
|
137
|
+
_this5.optimisticallyPerformStatusUpdate(itemOrItems, "archived", {
|
|
138
|
+
archived_at: now
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
return _this5.makeStatusUpdate(itemOrItems, "archived");
|
|
142
|
+
})();
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
markAsUnarchived(itemOrItems) {
|
|
146
|
+
var _this6 = this;
|
|
147
|
+
|
|
148
|
+
return _asyncToGenerator(function* () {
|
|
149
|
+
_this6.optimisticallyPerformStatusUpdate(itemOrItems, "unarchived", {
|
|
150
|
+
archived_at: null
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
return _this6.makeStatusUpdate(itemOrItems, "unarchived");
|
|
154
|
+
})();
|
|
155
|
+
}
|
|
156
|
+
/* Fetches the feed content, appending it to the store */
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
fetch() {
|
|
160
|
+
var _arguments = arguments,
|
|
161
|
+
_this7 = this;
|
|
162
|
+
|
|
163
|
+
return _asyncToGenerator(function* () {
|
|
164
|
+
var options = _arguments.length > 0 && _arguments[0] !== undefined ? _arguments[0] : {};
|
|
165
|
+
var {
|
|
166
|
+
setState,
|
|
167
|
+
getState
|
|
168
|
+
} = _this7.store;
|
|
169
|
+
var {
|
|
170
|
+
networkStatus
|
|
171
|
+
} = getState(); // If there's an existing request in flight, then do nothing
|
|
172
|
+
|
|
173
|
+
if (isRequestInFlight(networkStatus)) {
|
|
174
|
+
return;
|
|
175
|
+
} // Set the loading type based on the request type it is
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
setState(store => {
|
|
179
|
+
var _options$__loadingTyp;
|
|
180
|
+
|
|
181
|
+
return store.setNetworkStatus((_options$__loadingTyp = options.__loadingType) !== null && _options$__loadingTyp !== void 0 ? _options$__loadingTyp : NetworkStatus.loading);
|
|
182
|
+
}); // Always include the default params, if they have been set
|
|
183
|
+
|
|
184
|
+
var queryParams = _objectSpread(_objectSpread({}, _this7.defaultOptions), options);
|
|
185
|
+
|
|
186
|
+
var result = yield _this7.apiClient.makeRequest({
|
|
187
|
+
method: "GET",
|
|
188
|
+
url: "/v1/users/".concat(_this7.knock.userId, "/feeds/").concat(_this7.feedId),
|
|
189
|
+
params: queryParams
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
if (result.statusCode === "error") {
|
|
193
|
+
setState(store => store.setNetworkStatus(NetworkStatus.error));
|
|
194
|
+
return {
|
|
195
|
+
status: result.statusCode,
|
|
196
|
+
data: result.error || result.body
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
var response = {
|
|
201
|
+
entries: result.body.entries,
|
|
202
|
+
meta: result.body.meta,
|
|
203
|
+
page_info: result.body.page_info
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
if (options.before) {
|
|
207
|
+
var opts = {
|
|
208
|
+
shouldSetPage: false,
|
|
209
|
+
shouldAppend: true
|
|
210
|
+
};
|
|
211
|
+
setState(state => state.setResult(response, opts));
|
|
212
|
+
} else if (options.after) {
|
|
213
|
+
var _opts = {
|
|
214
|
+
shouldSetPage: true,
|
|
215
|
+
shouldAppend: true
|
|
216
|
+
};
|
|
217
|
+
setState(state => state.setResult(response, _opts));
|
|
218
|
+
} else {
|
|
219
|
+
setState(state => state.setResult(response));
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
_this7.broadcast("messages.new", response);
|
|
223
|
+
|
|
224
|
+
return {
|
|
225
|
+
data: response,
|
|
226
|
+
status: result.statusCode
|
|
227
|
+
};
|
|
228
|
+
})();
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
fetchNextPage() {
|
|
232
|
+
var _this8 = this;
|
|
233
|
+
|
|
234
|
+
return _asyncToGenerator(function* () {
|
|
235
|
+
// Attempts to fetch the next page of results (if we have any)
|
|
236
|
+
var {
|
|
237
|
+
getState
|
|
238
|
+
} = _this8.store;
|
|
239
|
+
var {
|
|
240
|
+
pageInfo
|
|
241
|
+
} = getState();
|
|
242
|
+
|
|
243
|
+
if (!pageInfo.after) {
|
|
244
|
+
// Nothing more to fetch
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
_this8.fetch({
|
|
249
|
+
after: pageInfo.after,
|
|
250
|
+
__loadingType: NetworkStatus.fetchMore
|
|
251
|
+
});
|
|
252
|
+
})();
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
broadcast(eventName, data) {
|
|
256
|
+
this.broadcaster.emit(eventName, data);
|
|
257
|
+
} // Invoked when a new real-time message comes in from the socket
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
onNewMessageReceived(_ref) {
|
|
261
|
+
var _this9 = this;
|
|
262
|
+
|
|
263
|
+
return _asyncToGenerator(function* () {
|
|
264
|
+
var {
|
|
265
|
+
metadata
|
|
266
|
+
} = _ref;
|
|
267
|
+
// Handle the new message coming in
|
|
268
|
+
var {
|
|
269
|
+
getState,
|
|
270
|
+
setState
|
|
271
|
+
} = _this9.store;
|
|
272
|
+
var currentHead = getState().items[0]; // Optimistically set the badge counts
|
|
273
|
+
|
|
274
|
+
setState(state => state.setMetadata(metadata)); // Fetch the items before the current head (if it exists)
|
|
275
|
+
|
|
276
|
+
_this9.fetch({
|
|
277
|
+
before: currentHead === null || currentHead === void 0 ? void 0 : currentHead.__cursor
|
|
278
|
+
});
|
|
279
|
+
})();
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
buildUserFeedId() {
|
|
283
|
+
return "".concat(this.feedId, ":").concat(this.knock.userId);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
optimisticallyPerformStatusUpdate(itemOrItems, type, attrs, badgeCountAttr) {
|
|
287
|
+
var {
|
|
288
|
+
getState,
|
|
289
|
+
setState
|
|
290
|
+
} = this.store;
|
|
291
|
+
var itemIds = Array.isArray(itemOrItems) ? itemOrItems.map(item => item.id) : [itemOrItems.id];
|
|
292
|
+
|
|
293
|
+
if (badgeCountAttr) {
|
|
294
|
+
var {
|
|
295
|
+
metadata
|
|
296
|
+
} = getState(); // Tnis is a hack to determine the direction of whether we're
|
|
297
|
+
// adding or removing from the badge count
|
|
298
|
+
|
|
299
|
+
var direction = type.startsWith("un") ? itemIds.length : -itemIds.length;
|
|
300
|
+
setState(store => store.setMetadata(_objectSpread(_objectSpread({}, metadata), {}, {
|
|
301
|
+
[badgeCountAttr]: Math.max(0, metadata[badgeCountAttr] + direction)
|
|
302
|
+
})));
|
|
303
|
+
} // Update the items with the given attributes
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
setState(store => store.setItemAttrs(itemIds, attrs));
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
makeStatusUpdate(itemOrItems, type) {
|
|
310
|
+
var _this10 = this;
|
|
311
|
+
|
|
312
|
+
return _asyncToGenerator(function* () {
|
|
313
|
+
// If we're interacting with an array, then we want to send this as a batch
|
|
314
|
+
if (Array.isArray(itemOrItems)) {
|
|
315
|
+
var itemIds = itemOrItems.map(item => item.id);
|
|
316
|
+
return yield _this10.apiClient.makeRequest({
|
|
317
|
+
method: "POST",
|
|
318
|
+
url: "/v1/messages/batch/".concat(type),
|
|
319
|
+
data: {
|
|
320
|
+
message_ids: itemIds
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
} // If its a single then we can just call the regular endpoint
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
var result = yield _this10.apiClient.makeRequest({
|
|
327
|
+
method: type.startsWith("un") ? "DELETE" : "PUT",
|
|
328
|
+
url: "/v1/messages/".concat(itemOrItems.id, "/").concat(type)
|
|
329
|
+
});
|
|
330
|
+
return result;
|
|
331
|
+
})();
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
export default Feed;
|
|
337
|
+
//# sourceMappingURL=feed.js.map
|