sidechat.js 2.0.2 → 2.0.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 (54) hide show
  1. package/dist/index.cjs +436 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.mjs +431 -0
  4. package/package.json +18 -13
  5. package/rollup.config.mjs +23 -0
  6. package/tsconfig.json +4 -2
  7. package/dist/sidechat.cjs +0 -2
  8. package/dist/sidechat.cjs.map +0 -1
  9. package/dist/sidechat.modern.js +0 -2
  10. package/dist/sidechat.modern.js.map +0 -1
  11. package/dist/sidechat.module.js +0 -2
  12. package/dist/sidechat.module.js.map +0 -1
  13. package/dist/sidechat.umd.js +0 -2
  14. package/dist/sidechat.umd.js.map +0 -1
  15. package/src/classes/SidechatAPIClient.d.ts +0 -104
  16. package/src/classes/SidechatAPIClient.d.ts.map +0 -1
  17. package/src/classes/SidechatAPIError.d.ts +0 -10
  18. package/src/classes/SidechatAPIError.d.ts.map +0 -1
  19. package/src/index.d.ts.map +0 -1
  20. package/src/types/SidechatTypes.d.ts +0 -224
  21. package/src/types/SidechatTypes.d.ts.map +0 -1
  22. /package/{src/index.d.ts → dist/index.d.mts} +0 -0
  23. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/SidechatAPIClient.html +0 -0
  24. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/SidechatAPIError.html +0 -0
  25. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/classes_SidechatAPIClient.js.html +0 -0
  26. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/classes_SidechatAPIError.js.html +0 -0
  27. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/data/search.json +0 -0
  28. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/fonts/Inconsolata-Regular.ttf +0 -0
  29. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/fonts/OpenSans-Regular.ttf +0 -0
  30. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/fonts/WorkSans-Bold.ttf +0 -0
  31. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/global.html +0 -0
  32. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/index.html +0 -0
  33. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/core.js +0 -0
  34. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/core.min.js +0 -0
  35. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/resize.js +0 -0
  36. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/search.js +0 -0
  37. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/search.min.js +0 -0
  38. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/third-party/Apache-License-2.0.txt +0 -0
  39. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/third-party/fuse.js +0 -0
  40. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/third-party/hljs-line-num-original.js +0 -0
  41. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/third-party/hljs-line-num.js +0 -0
  42. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/third-party/hljs-original.js +0 -0
  43. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/third-party/hljs.js +0 -0
  44. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/third-party/popper.js +0 -0
  45. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/third-party/tippy.js +0 -0
  46. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/third-party/tocbot.js +0 -0
  47. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/scripts/third-party/tocbot.min.js +0 -0
  48. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/styles/clean-jsdoc-theme-base.css +0 -0
  49. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/styles/clean-jsdoc-theme-dark.css +0 -0
  50. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/styles/clean-jsdoc-theme-light.css +0 -0
  51. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/styles/clean-jsdoc-theme.min.css +0 -0
  52. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/tutorial-Authentication.html +0 -0
  53. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/tutorial-Email Registration.html +0 -0
  54. /package/docs/sidechat.js/{2.0.0 → 2.0.4}/types_SidechatTypes.js.html +0 -0
package/dist/index.mjs ADDED
@@ -0,0 +1,431 @@
1
+ /**
2
+ * Throwable error caused by the Sidechat API
3
+ * @class
4
+ * @extends Error
5
+ */
6
+ class SidechatAPIError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "SidechatAPIError";
10
+ }
11
+ }
12
+
13
+ /**
14
+ * API client class for making requests to Sidechat's private API. You'll need to [authenticate]{@tutorial Authentication} before using most of the methods.
15
+ * @class
16
+ * @since 2.0.0-alpha.0
17
+ */
18
+ class SidechatAPIClient {
19
+ /**
20
+ * User bearer token
21
+ * @type {SidechatAuthToken}
22
+ * */
23
+ userToken;
24
+ /**
25
+ * Default headers for every API request
26
+ * @type {Object}
27
+ * @static
28
+ */
29
+ defaultHeaders = {
30
+ Accept: "application/json",
31
+ "Content-Type": "application/json",
32
+ };
33
+
34
+ /**
35
+ * Create a new instance of the API client
36
+ * @param {SidechatAuthToken} [token] - user bearer token
37
+ */
38
+ constructor(token = "") {
39
+ if (token) {
40
+ this.userToken = token;
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Manually set the currently signed in user's token. Generally try to avoid this and instead either pass a token to the constructor or login automatically through the auth functions
46
+ * @method
47
+ * @param {SidechatAuthToken} token - user bearer token
48
+ */
49
+ setToken = (token) => {
50
+ this.userToken = token;
51
+ };
52
+
53
+ /**
54
+ * Initiate the login process with a phone number. Should be followed up with verifySMSCode().
55
+ * @method
56
+ * @param {Number} phoneNumber - US phone number (WITHOUT +1) to send verification code to
57
+ */
58
+ loginViaSMS = async (phoneNumber) => {
59
+ try {
60
+ const res = await fetch(`https://api.sidechat.lol/v1/login_register`, {
61
+ method: "POST",
62
+ headers: this.defaultHeaders,
63
+ body: JSON.stringify({
64
+ phone_number: `+1${phoneNumber}`,
65
+ version: 3,
66
+ }),
67
+ });
68
+ const json = await res.json();
69
+ return json;
70
+ } catch (err) {
71
+ console.error(err);
72
+ throw new SidechatAPIError("Failed to request SMS verification.");
73
+ }
74
+ };
75
+
76
+ /**
77
+ * Verify the code sent via SMS with loginViaSMS().
78
+ * @method
79
+ * @param {Number} phoneNumber - US phone number (WITHOUT +1) that verification code was sent to
80
+ * @param {String} code - the verification code
81
+ */
82
+ verifySMSCode = async (phoneNumber, code) => {
83
+ try {
84
+ const res = await fetch(
85
+ `https://api.sidechat.lol/v1/verify_phone_number`,
86
+ {
87
+ method: "POST",
88
+ headers: this.defaultHeaders,
89
+ body: JSON.stringify({
90
+ phone_number: `+1${phoneNumber}`,
91
+ code: code.toUpperCase(),
92
+ }),
93
+ }
94
+ );
95
+ const json = await res.json();
96
+ if (json?.logged_in_user?.token) {
97
+ this.userToken = json.logged_in_user.token;
98
+ }
99
+ return json;
100
+ } catch (err) {
101
+ console.error(err);
102
+ throw new SidechatAPIError("Failed verify this code.");
103
+ }
104
+ };
105
+
106
+ /**
107
+ * Set the user's age
108
+ * @method
109
+ * @param {Number} age - user's age in years
110
+ * @param {String} registrationID - the registration ID generated by verifySMSCode()
111
+ */
112
+ setAge = async (age, registrationID) => {
113
+ if (age < 13) {
114
+ throw new SidechatAPIError("You're too young to use Offsides.");
115
+ }
116
+ try {
117
+ const res = await fetch(
118
+ `https://api.sidechat.lol/v1/complete_registration`,
119
+ {
120
+ method: "POST",
121
+ headers: this.defaultHeaders,
122
+ body: JSON.stringify({
123
+ age: Number(age),
124
+ registration_id: registrationID,
125
+ }),
126
+ }
127
+ );
128
+ const json = await res.json();
129
+ if (json.token) {
130
+ this.userToken = json.token;
131
+ }
132
+ return json;
133
+ } catch (err) {
134
+ console.error(err);
135
+ throw new SidechatAPIError("Failed verify this code.");
136
+ }
137
+ };
138
+
139
+ /**
140
+ * Initiate the email setup process. Should be followed up with checkEmailVerification().
141
+ * @method
142
+ * @param {String} email - school email address to send verification code to
143
+ * @tutorial Email Registration
144
+ */
145
+ registerEmail = async (email) => {
146
+ if (!this.userToken) {
147
+ throw new SidechatAPIError("User is not authenticated.");
148
+ }
149
+ try {
150
+ const res = await fetch(
151
+ `https://api.sidechat.lol/v2/users/register_email`,
152
+ {
153
+ method: "POST",
154
+ headers: {
155
+ ...this.defaultHeaders,
156
+ Authorization: `Bearer ${this.userToken}`,
157
+ },
158
+ body: JSON.stringify({
159
+ email: email,
160
+ }),
161
+ }
162
+ );
163
+ const json = await res.json();
164
+ if (json.message) {
165
+ throw new SidechatAPIError(json.message);
166
+ }
167
+ return json;
168
+ } catch (err) {
169
+ console.error(error);
170
+ throw new SidechatAPIError("Failed to request email verification.");
171
+ }
172
+ };
173
+
174
+ /**
175
+ * Check is the user's email is verified.
176
+ * @method
177
+ */
178
+ checkEmailVerification = async () => {
179
+ if (!this.userToken) {
180
+ throw new SidechatAPIError("User is not authenticated.");
181
+ }
182
+ try {
183
+ const res = await fetch(
184
+ `https://api.sidechat.lol/v1/users/check_email_verified`,
185
+ {
186
+ method: "GET",
187
+ headers: {
188
+ ...this.defaultHeaders,
189
+ Authorization: `Bearer ${this.userToken}`,
190
+ },
191
+ }
192
+ );
193
+ const json = await res.json();
194
+ if (json.verified_email_updates_response) {
195
+ return json.verified_email_updates_response;
196
+ } else {
197
+ throw new SidechatAPIError(json?.message || "Email is not verified.");
198
+ }
199
+ } catch (err) {
200
+ console.error(error);
201
+ throw new SidechatAPIError("Email is not verified.");
202
+ }
203
+ };
204
+
205
+ /**
206
+ * Set the device ID of the current user
207
+ * @method
208
+ * @param {String} deviceId - the device ID to set
209
+ */
210
+ setDeviceID = async (deviceID) => {
211
+ if (!this.userToken) {
212
+ throw new SidechatAPIError("User is not authenticated.");
213
+ }
214
+ try {
215
+ const res = await fetch(
216
+ `https://api.sidechat.lol/v1/register_device_token`,
217
+ {
218
+ method: "POST",
219
+ headers: {
220
+ ...this.defaultHeaders,
221
+ Authorization: `Bearer ${this.userToken}`,
222
+ },
223
+ body: JSON.stringify({
224
+ build_type: "release",
225
+ bundle_id: "com.flowerave.sidechat",
226
+ device_token: deviceID,
227
+ }),
228
+ }
229
+ );
230
+ const json = await res.json();
231
+ await AsyncStorage.setItem("deviceID", deviceID);
232
+ return json;
233
+ } catch (err) {
234
+ console.error(err);
235
+ throw new SidechatAPIError("Failed verify this code.");
236
+ }
237
+ };
238
+
239
+ /**
240
+ * Get updated status for user and group
241
+ * @method
242
+ * @param {String} [groupID] - ID of a specific group to retrieve info from
243
+ */
244
+ getUserAndGroup = async (groupID = "") => {
245
+ if (!this.userToken) {
246
+ throw new SidechatAPIError("User is not authenticated.");
247
+ }
248
+ try {
249
+ const res = await fetch(
250
+ `https://api.sidechat.lol/v1/updates?group_id=${groupID}`,
251
+ {
252
+ method: "GET",
253
+ headers: {
254
+ ...this.defaultHeaders,
255
+ Authorization: `Bearer ${this.userToken}`,
256
+ },
257
+ }
258
+ );
259
+ const json = await res.json();
260
+ return json;
261
+ } catch (err) {
262
+ console.error(err);
263
+ throw new SidechatAPIError(`Failed to get posts from group.`);
264
+ }
265
+ };
266
+
267
+ /**
268
+ * Fetches posts from the specified category in a group
269
+ * @method
270
+ * @param {String} groupID - group ID
271
+ * @param {"hot"|"recent"|"top"} category - category to filter posts
272
+ * @param {SidechatCursorString} [cursor] - cursor string
273
+ * @returns {SidechatPostsAndCursor} List of posts and cursor
274
+ */
275
+ getGroupPosts = async (groupID, category = "hot", cursor) => {
276
+ if (!this.userToken) {
277
+ throw new SidechatAPIError("User is not authenticated.");
278
+ }
279
+ try {
280
+ const res = await fetch(
281
+ `https://api.sidechat.lol/v1/posts?group_id=${groupID}&type=${category}${
282
+ cursor ? "&cursor=" + cursor : ""
283
+ }`,
284
+ {
285
+ method: "GET",
286
+ headers: {
287
+ ...this.defaultHeaders,
288
+ Authorization: `Bearer ${this.userToken}`,
289
+ },
290
+ }
291
+ );
292
+ const json = await res.json();
293
+ return json;
294
+ } catch (err) {
295
+ console.error(err);
296
+ throw new SidechatAPIError(`Failed to get posts from group.`);
297
+ }
298
+ };
299
+
300
+ /**
301
+ * Upvote or downvote, or unvote a post
302
+ * @method
303
+ * @param {String} postID - post ID to vote on
304
+ * @param {SidechatVoteString} action - whether to upvote, downvote, or reset vote
305
+ */
306
+ setVote = async (postID, action) => {
307
+ if (!this.userToken) {
308
+ throw new SidechatAPIError("User is not authenticated.");
309
+ }
310
+ try {
311
+ const res = await fetch(`https://api.sidechat.lol/v1/posts/set_vote`, {
312
+ method: "POST",
313
+ headers: {
314
+ ...this.defaultHeaders,
315
+ Authorization: `Bearer ${this.userToken}`,
316
+ },
317
+ body: JSON.stringify({
318
+ post_id: postID,
319
+ vote_status: action,
320
+ }),
321
+ });
322
+ const json = await res.json();
323
+ return json;
324
+ } catch (err) {
325
+ console.error(err);
326
+ throw new SidechatAPIError(`Failed to change the vote on post.`);
327
+ }
328
+ };
329
+
330
+ /**
331
+ * Get all the commments on a post
332
+ * @method
333
+ * @param {String} postID - post ID to get comments for
334
+ * @returns {SidechatPostOrComment[]} list of comments
335
+ */
336
+ getPostComments = async (postID) => {
337
+ if (!this.userToken) {
338
+ throw new SidechatAPIError("User is not authenticated.");
339
+ }
340
+ try {
341
+ const res = await fetch(
342
+ `https://api.sidechat.lol/v1/posts/comments/?post_id=${postID}`,
343
+ {
344
+ method: "GET",
345
+ headers: {
346
+ ...this.defaultHeaders,
347
+ Authorization: `Bearer ${this.userToken}`,
348
+ },
349
+ }
350
+ );
351
+ const json = await res.json();
352
+ // Function to preprocess the comments and organize them into a nested structure
353
+ function preprocessComments(apiComments) {
354
+ // Map to store comments by their IDs for efficient lookup
355
+ const commentMap = new Map();
356
+ // List to store top-level comments
357
+ const topLevelComments = [];
358
+
359
+ // Iterate through the API comments
360
+ apiComments.forEach((comment) => {
361
+ // Store the comment in the map with its ID as the key
362
+ commentMap.set(comment.id, comment);
363
+ // Get the parent comment using the reply_post_id
364
+ const parentComment = commentMap.get(comment.reply_post_id);
365
+ // Check if the comment is a top-level comment
366
+ if (
367
+ !parentComment ||
368
+ comment.reply_post_id === comment.parent_post_id
369
+ ) {
370
+ // If it's a top-level comment, push it to the topLevelComments array
371
+ topLevelComments.push(comment);
372
+ } else {
373
+ // If it's a reply, add it to the parent comment's replies array
374
+ if (!parentComment.replies) parentComment.replies = [];
375
+ parentComment.replies.push(comment);
376
+ }
377
+ });
378
+
379
+ // Flatten the nested structure and return a single list of comments
380
+ return flattenComments(topLevelComments);
381
+ }
382
+
383
+ // Function to flatten nested comments into a single list
384
+ function flattenComments(comments) {
385
+ // Use reduce to flatten the nested comments array into a single list
386
+ return comments.reduce((flatComments, comment) => {
387
+ // Push the current comment to the flatComments array
388
+ flatComments.push(comment);
389
+ // If the current comment has replies, recursively flatten them and push to the flatComments array
390
+ if (comment.replies)
391
+ flatComments.push(...flattenComments(comment.replies));
392
+ // Return the flatComments array
393
+ return flatComments;
394
+ }, []);
395
+ }
396
+
397
+ const sortedComments = preprocessComments(json.posts);
398
+ return sortedComments;
399
+ } catch (err) {
400
+ console.error(err);
401
+ throw new SidechatAPIError(`Failed to get comments on post.`);
402
+ }
403
+ };
404
+
405
+ /**
406
+ * Gets groups to be displayed on the "Explore Groups" page
407
+ * @method
408
+ * @returns {SidechatGroup[]}
409
+ */
410
+ getAvailableGroups = async () => {
411
+ if (!this.userToken) {
412
+ throw new SidechatAPIError("User is not authenticated.");
413
+ }
414
+ try {
415
+ const res = await fetch(`https://api.sidechat.lol/v1/groups/explore`, {
416
+ method: "GET",
417
+ headers: {
418
+ ...this.defaultHeaders,
419
+ Authorization: `Bearer ${this.userToken}`,
420
+ },
421
+ });
422
+ const json = await res.json();
423
+ return await json.groups;
424
+ } catch (err) {
425
+ console.error(err);
426
+ throw new SidechatAPIError(`Failed to get groups from explore.`);
427
+ }
428
+ };
429
+ }
430
+
431
+ export { SidechatAPIClient, SidechatAPIError };
package/package.json CHANGED
@@ -1,20 +1,27 @@
1
1
  {
2
2
  "name": "sidechat.js",
3
- "version": "2.0.2",
3
+ "version": "2.0.4",
4
4
  "description": "A reverse-engineered API wrapper for Sidechat",
5
5
  "type": "module",
6
6
  "source": "./src/index.js",
7
- "types": "./src/index.d.ts",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.mjs",
9
+ "types": "./dist/index.d.ts",
8
10
  "exports": {
9
- "default": "./dist/sidechat.modern.js",
10
- "require": "./dist/sidechat.cjs"
11
+ ".": {
12
+ "import": {
13
+ "types": "./dist/index.d.mts",
14
+ "default": "./dist/index.mjs"
15
+ },
16
+ "require": {
17
+ "types": "./dist/index.d.ts",
18
+ "default": "./dist/index.cjs"
19
+ }
20
+ }
11
21
  },
12
- "unpkg": "./dist/sidechat.umd.js",
13
- "main": "./dist/sidechat.cjs",
14
- "module": "./dist/sidechat.module.js",
15
22
  "scripts": {
16
- "build": "microbundle",
17
- "dev": "microbundle watch",
23
+ "build": "rollup -c",
24
+ "dev": "rollup -c --watch",
18
25
  "docs": "jsdoc --configure jsdoc.json --verbose",
19
26
  "prepublish": "tsc",
20
27
  "typegen": "tsc"
@@ -34,11 +41,9 @@
34
41
  },
35
42
  "devDependencies": {
36
43
  "clean-jsdoc-theme": "^4.2.17",
37
- "microbundle": "^0.15.1",
38
44
  "prompt-sync": "^4.2.0",
45
+ "rollup": "^2.79.1",
46
+ "rollup-plugin-copy": "^3.5.0",
39
47
  "typescript": "^5.4.2"
40
- },
41
- "dependencies": {
42
- "tsd-jsdoc": "^2.5.0"
43
48
  }
44
49
  }
@@ -0,0 +1,23 @@
1
+ import copy from "rollup-plugin-copy";
2
+
3
+ export default {
4
+ input: "src/index.js",
5
+ output: [
6
+ {
7
+ file: "dist/index.cjs",
8
+ format: "cjs",
9
+ },
10
+ {
11
+ file: "dist/index.mjs",
12
+ format: "es",
13
+ },
14
+ ],
15
+ plugins: [
16
+ // ...
17
+ copy({
18
+ targets: [
19
+ { src: "dist/index.d.ts", dest: "dist", rename: "index.d.mts" },
20
+ ],
21
+ }),
22
+ ],
23
+ };
package/tsconfig.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  // Change this to match your project
3
- "include": ["src/*.js"],
3
+ "include": ["src/*.js", "src/classes/*.js", "src/types/*.js"],
4
4
  "exclude": ["src/tests", "src/internal"],
5
5
  "compilerOptions": {
6
6
  // Tells TypeScript to read JS files, as
@@ -13,6 +13,8 @@
13
13
  "emitDeclarationOnly": true,
14
14
  // go to js file when using IDE functions like
15
15
  // "Go to Definition" in VSCode
16
- "declarationMap": true
16
+ "declarationMap": true,
17
+ "declarationDir": "dist",
18
+ "outDir": "dist"
17
19
  }
18
20
  }
package/dist/sidechat.cjs DELETED
@@ -1,2 +0,0 @@
1
- function e(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(e=function(){return!!t})()}function t(){return t=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},t.apply(this,arguments)}function r(e){return r=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},r(e)}function o(e,t){return o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},o(e,t)}function n(t){var i="function"==typeof Map?new Map:void 0;return n=function(t){if(null===t||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==i){if(i.has(t))return i.get(t);i.set(t,n)}function n(){return function(t,r,n){if(e())return Reflect.construct.apply(null,arguments);var i=[null];i.push.apply(i,r);var s=new(t.bind.apply(t,i));return n&&o(s,n.prototype),s}(t,arguments,r(this).constructor)}return n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),o(n,t)},n(t)}var i=/*#__PURE__*/function(e){var t,r;function n(t){var r;return(r=e.call(this,t)||this).name="SidechatAPIError",r}return r=e,(t=n).prototype=Object.create(r.prototype),t.prototype.constructor=t,o(t,r),n}(/*#__PURE__*/n(Error));function s(e,t){try{var r=e()}catch(e){return t(e)}return r&&r.then?r.then(void 0,t):r}exports.SidechatAPIClient=function(e){var r=this,o=this,n=this,u=this,c=this,a=this,h=this,l=this,f=this,d=this,p=this,v=this;void 0===e&&(e=""),this.defaultHeaders={Accept:"application/json","Content-Type":"application/json"},this.setToken=function(e){v.userToken=e},this.loginViaSMS=function(e){try{return Promise.resolve(s(function(){return Promise.resolve(fetch("https://api.sidechat.lol/v1/login_register",{method:"POST",headers:r.defaultHeaders,body:JSON.stringify({phone_number:"+1"+e,version:3})})).then(function(e){return Promise.resolve(e.json())})},function(e){throw console.error(e),new i("Failed to request SMS verification.")}))}catch(e){return Promise.reject(e)}},this.verifySMSCode=function(e,t){try{return Promise.resolve(s(function(){return Promise.resolve(fetch("https://api.sidechat.lol/v1/verify_phone_number",{method:"POST",headers:o.defaultHeaders,body:JSON.stringify({phone_number:"+1"+e,code:t.toUpperCase()})})).then(function(e){return Promise.resolve(e.json()).then(function(e){var t;return null!=e&&null!=(t=e.logged_in_user)&&t.token&&(o.userToken=e.logged_in_user.token),e})})},function(e){throw console.error(e),new i("Failed verify this code.")}))}catch(e){return Promise.reject(e)}},this.setAge=function(e,t){try{if(e<13)throw new i("You're too young to use Offsides.");return Promise.resolve(s(function(){return Promise.resolve(fetch("https://api.sidechat.lol/v1/complete_registration",{method:"POST",headers:n.defaultHeaders,body:JSON.stringify({age:Number(e),registration_id:t})})).then(function(e){return Promise.resolve(e.json()).then(function(e){return e.token&&(n.userToken=e.token),e})})},function(e){throw console.error(e),new i("Failed verify this code.")}))}catch(e){return Promise.reject(e)}},this.registerEmail=function(e){try{if(!u.userToken)throw new i("User is not authenticated.");return Promise.resolve(s(function(){return Promise.resolve(fetch("https://api.sidechat.lol/v2/users/register_email",{method:"POST",headers:t({},u.defaultHeaders,{Authorization:"Bearer "+u.userToken}),body:JSON.stringify({email:e})})).then(function(e){return Promise.resolve(e.json()).then(function(e){if(e.message)throw new i(e.message);return e})})},function(){throw console.error(error),new i("Failed to request email verification.")}))}catch(e){return Promise.reject(e)}},this.checkEmailVerification=function(){try{if(!c.userToken)throw new i("User is not authenticated.");return Promise.resolve(s(function(){return Promise.resolve(fetch("https://api.sidechat.lol/v1/users/check_email_verified",{method:"GET",headers:t({},c.defaultHeaders,{Authorization:"Bearer "+c.userToken})})).then(function(e){return Promise.resolve(e.json()).then(function(e){if(e.verified_email_updates_response)return e.verified_email_updates_response;throw new i((null==e?void 0:e.message)||"Email is not verified.")})})},function(){throw console.error(error),new i("Email is not verified.")}))}catch(e){return Promise.reject(e)}},this.setDeviceID=function(e){try{if(!a.userToken)throw new i("User is not authenticated.");return Promise.resolve(s(function(){return Promise.resolve(fetch("https://api.sidechat.lol/v1/register_device_token",{method:"POST",headers:t({},a.defaultHeaders,{Authorization:"Bearer "+a.userToken}),body:JSON.stringify({build_type:"release",bundle_id:"com.flowerave.sidechat",device_token:e})})).then(function(t){return Promise.resolve(t.json()).then(function(t){return Promise.resolve(AsyncStorage.setItem("deviceID",e)).then(function(){return t})})})},function(e){throw console.error(e),new i("Failed verify this code.")}))}catch(e){return Promise.reject(e)}},this.getUserAndGroup=function(e){void 0===e&&(e="");try{if(!h.userToken)throw new i("User is not authenticated.");return Promise.resolve(s(function(){return Promise.resolve(fetch("https://api.sidechat.lol/v1/updates?group_id="+e,{method:"GET",headers:t({},h.defaultHeaders,{Authorization:"Bearer "+h.userToken})})).then(function(e){return Promise.resolve(e.json())})},function(e){throw console.error(e),new i("Failed to get posts from group.")}))}catch(e){return Promise.reject(e)}},this.getGroupPosts=function(e,r,o){void 0===r&&(r="hot");try{if(!l.userToken)throw new i("User is not authenticated.");return Promise.resolve(s(function(){return Promise.resolve(fetch("https://api.sidechat.lol/v1/posts?group_id="+e+"&type="+r+(o?"&cursor="+o:""),{method:"GET",headers:t({},l.defaultHeaders,{Authorization:"Bearer "+l.userToken})})).then(function(e){return Promise.resolve(e.json())})},function(e){throw console.error(e),new i("Failed to get posts from group.")}))}catch(e){return Promise.reject(e)}},this.setVote=function(e,r){try{if(!f.userToken)throw new i("User is not authenticated.");return Promise.resolve(s(function(){return Promise.resolve(fetch("https://api.sidechat.lol/v1/posts/set_vote",{method:"POST",headers:t({},f.defaultHeaders,{Authorization:"Bearer "+f.userToken}),body:JSON.stringify({post_id:e,vote_status:r})})).then(function(e){return Promise.resolve(e.json())})},function(e){throw console.error(e),new i("Failed to change the vote on post.")}))}catch(e){return Promise.reject(e)}},this.getPostComments=function(e){try{if(!d.userToken)throw new i("User is not authenticated.");return Promise.resolve(s(function(){return Promise.resolve(fetch("https://api.sidechat.lol/v1/posts/comments/?post_id="+e,{method:"GET",headers:t({},d.defaultHeaders,{Authorization:"Bearer "+d.userToken})})).then(function(e){function t(e){var t=new Map,o=[];return e.forEach(function(e){t.set(e.id,e);var r=t.get(e.reply_post_id);r&&e.reply_post_id!==e.parent_post_id?(r.replies||(r.replies=[]),r.replies.push(e)):o.push(e)}),r(o)}function r(e){return e.reduce(function(e,t){return e.push(t),t.replies&&e.push.apply(e,r(t.replies)),e},[])}return Promise.resolve(e.json()).then(function(e){return t(e.posts)})})},function(e){throw console.error(e),new i("Failed to get comments on post.")}))}catch(e){return Promise.reject(e)}},this.getAvailableGroups=function(){try{if(!p.userToken)throw new i("User is not authenticated.");return Promise.resolve(s(function(){return Promise.resolve(fetch("https://api.sidechat.lol/v1/groups/explore",{method:"GET",headers:t({},p.defaultHeaders,{Authorization:"Bearer "+p.userToken})})).then(function(e){return Promise.resolve(e.json()).then(function(e){return Promise.resolve(e.groups)})})},function(e){throw console.error(e),new i("Failed to get groups from explore.")}))}catch(e){return Promise.reject(e)}},e&&(this.userToken=e)},exports.SidechatAPIError=i;
2
- //# sourceMappingURL=sidechat.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sidechat.cjs","sources":["../src/classes/SidechatAPIError.js","../src/classes/SidechatAPIClient.js"],"sourcesContent":["/**\r\n * Throwable error caused by the Sidechat API\r\n * @class\r\n * @extends Error\r\n */\r\nclass SidechatAPIError extends Error {\r\n constructor(message) {\r\n super(message);\r\n this.name = \"SidechatAPIError\";\r\n }\r\n}\r\n\r\nexport default SidechatAPIError;\r\n","import \"../types/SidechatTypes.js\";\r\nimport SidechatAPIError from \"../classes/SidechatAPIError.js\";\r\n\r\n/**\r\n * API client class for making requests to Sidechat's private API. You'll need to [authenticate]{@tutorial Authentication} before using most of the methods.\r\n * @class\r\n * @since 2.0.0-alpha.0\r\n */\r\nclass SidechatAPIClient {\r\n /**\r\n * User bearer token\r\n * @type {SidechatAuthToken}\r\n * */\r\n userToken;\r\n /**\r\n * Default headers for every API request\r\n * @type {Object}\r\n * @static\r\n */\r\n defaultHeaders = {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n };\r\n\r\n /**\r\n * Create a new instance of the API client\r\n * @param {SidechatAuthToken} [token] - user bearer token\r\n */\r\n constructor(token = \"\") {\r\n if (token) {\r\n this.userToken = token;\r\n }\r\n }\r\n\r\n /**\r\n * Manually set the currently signed in user's token. Generally try to avoid this and instead either pass a token to the constructor or login automatically through the auth functions\r\n * @method\r\n * @param {SidechatAuthToken} token - user bearer token\r\n */\r\n setToken = (token) => {\r\n this.userToken = token;\r\n };\r\n\r\n /**\r\n * Initiate the login process with a phone number. Should be followed up with verifySMSCode().\r\n * @method\r\n * @param {Number} phoneNumber - US phone number (WITHOUT +1) to send verification code to\r\n */\r\n loginViaSMS = async (phoneNumber) => {\r\n try {\r\n const res = await fetch(`https://api.sidechat.lol/v1/login_register`, {\r\n method: \"POST\",\r\n headers: this.defaultHeaders,\r\n body: JSON.stringify({\r\n phone_number: `+1${phoneNumber}`,\r\n version: 3,\r\n }),\r\n });\r\n const json = await res.json();\r\n return json;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(\"Failed to request SMS verification.\");\r\n }\r\n };\r\n\r\n /**\r\n * Verify the code sent via SMS with loginViaSMS().\r\n * @method\r\n * @param {Number} phoneNumber - US phone number (WITHOUT +1) that verification code was sent to\r\n * @param {String} code - the verification code\r\n */\r\n verifySMSCode = async (phoneNumber, code) => {\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v1/verify_phone_number`,\r\n {\r\n method: \"POST\",\r\n headers: this.defaultHeaders,\r\n body: JSON.stringify({\r\n phone_number: `+1${phoneNumber}`,\r\n code: code.toUpperCase(),\r\n }),\r\n }\r\n );\r\n const json = await res.json();\r\n if (json?.logged_in_user?.token) {\r\n this.userToken = json.logged_in_user.token;\r\n }\r\n return json;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(\"Failed verify this code.\");\r\n }\r\n };\r\n\r\n /**\r\n * Set the user's age\r\n * @method\r\n * @param {Number} age - user's age in years\r\n * @param {String} registrationID - the registration ID generated by verifySMSCode()\r\n */\r\n setAge = async (age, registrationID) => {\r\n if (age < 13) {\r\n throw new SidechatAPIError(\"You're too young to use Offsides.\");\r\n }\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v1/complete_registration`,\r\n {\r\n method: \"POST\",\r\n headers: this.defaultHeaders,\r\n body: JSON.stringify({\r\n age: Number(age),\r\n registration_id: registrationID,\r\n }),\r\n }\r\n );\r\n const json = await res.json();\r\n if (json.token) {\r\n this.userToken = json.token;\r\n }\r\n return json;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(\"Failed verify this code.\");\r\n }\r\n };\r\n\r\n /**\r\n * Initiate the email setup process. Should be followed up with checkEmailVerification().\r\n * @method\r\n * @param {String} email - school email address to send verification code to\r\n * @tutorial Email Registration\r\n */\r\n registerEmail = async (email) => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v2/users/register_email`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n body: JSON.stringify({\r\n email: email,\r\n }),\r\n }\r\n );\r\n const json = await res.json();\r\n if (json.message) {\r\n throw new SidechatAPIError(json.message);\r\n }\r\n return json;\r\n } catch (err) {\r\n console.error(error);\r\n throw new SidechatAPIError(\"Failed to request email verification.\");\r\n }\r\n };\r\n\r\n /**\r\n * Check is the user's email is verified.\r\n * @method\r\n */\r\n checkEmailVerification = async () => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v1/users/check_email_verified`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n }\r\n );\r\n const json = await res.json();\r\n if (json.verified_email_updates_response) {\r\n return json.verified_email_updates_response;\r\n } else {\r\n throw new SidechatAPIError(json?.message || \"Email is not verified.\");\r\n }\r\n } catch (err) {\r\n console.error(error);\r\n throw new SidechatAPIError(\"Email is not verified.\");\r\n }\r\n };\r\n\r\n /**\r\n * Set the device ID of the current user\r\n * @method\r\n * @param {String} deviceId - the device ID to set\r\n */\r\n setDeviceID = async (deviceID) => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v1/register_device_token`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n body: JSON.stringify({\r\n build_type: \"release\",\r\n bundle_id: \"com.flowerave.sidechat\",\r\n device_token: deviceID,\r\n }),\r\n }\r\n );\r\n const json = await res.json();\r\n await AsyncStorage.setItem(\"deviceID\", deviceID);\r\n return json;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(\"Failed verify this code.\");\r\n }\r\n };\r\n\r\n /**\r\n * Get updated status for user and group\r\n * @method\r\n * @param {String} [groupID] - ID of a specific group to retrieve info from\r\n */\r\n getUserAndGroup = async (groupID = \"\") => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v1/updates?group_id=${groupID}`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n }\r\n );\r\n const json = await res.json();\r\n return json;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(`Failed to get posts from group.`);\r\n }\r\n };\r\n\r\n /**\r\n * Fetches posts from the specified category in a group\r\n * @method\r\n * @param {String} groupID - group ID\r\n * @param {\"hot\"|\"recent\"|\"top\"} category - category to filter posts\r\n * @param {SidechatCursorString} [cursor] - cursor string\r\n * @returns {SidechatPostsAndCursor} List of posts and cursor\r\n */\r\n getGroupPosts = async (groupID, category = \"hot\", cursor) => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v1/posts?group_id=${groupID}&type=${category}${\r\n cursor ? \"&cursor=\" + cursor : \"\"\r\n }`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n }\r\n );\r\n const json = await res.json();\r\n return json;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(`Failed to get posts from group.`);\r\n }\r\n };\r\n\r\n /**\r\n * Upvote or downvote, or unvote a post\r\n * @method\r\n * @param {String} postID - post ID to vote on\r\n * @param {SidechatVoteString} action - whether to upvote, downvote, or reset vote\r\n */\r\n setVote = async (postID, action) => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(`https://api.sidechat.lol/v1/posts/set_vote`, {\r\n method: \"POST\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n body: JSON.stringify({\r\n post_id: postID,\r\n vote_status: action,\r\n }),\r\n });\r\n const json = await res.json();\r\n return json;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(`Failed to change the vote on post.`);\r\n }\r\n };\r\n\r\n /**\r\n * Get all the commments on a post\r\n * @method\r\n * @param {String} postID - post ID to get comments for\r\n * @returns {SidechatPostOrComment[]} list of comments\r\n */\r\n getPostComments = async (postID) => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v1/posts/comments/?post_id=${postID}`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n }\r\n );\r\n const json = await res.json();\r\n // Function to preprocess the comments and organize them into a nested structure\r\n function preprocessComments(apiComments) {\r\n // Map to store comments by their IDs for efficient lookup\r\n const commentMap = new Map();\r\n // List to store top-level comments\r\n const topLevelComments = [];\r\n\r\n // Iterate through the API comments\r\n apiComments.forEach((comment) => {\r\n // Store the comment in the map with its ID as the key\r\n commentMap.set(comment.id, comment);\r\n // Get the parent comment using the reply_post_id\r\n const parentComment = commentMap.get(comment.reply_post_id);\r\n // Check if the comment is a top-level comment\r\n if (\r\n !parentComment ||\r\n comment.reply_post_id === comment.parent_post_id\r\n ) {\r\n // If it's a top-level comment, push it to the topLevelComments array\r\n topLevelComments.push(comment);\r\n } else {\r\n // If it's a reply, add it to the parent comment's replies array\r\n if (!parentComment.replies) parentComment.replies = [];\r\n parentComment.replies.push(comment);\r\n }\r\n });\r\n\r\n // Flatten the nested structure and return a single list of comments\r\n return flattenComments(topLevelComments);\r\n }\r\n\r\n // Function to flatten nested comments into a single list\r\n function flattenComments(comments) {\r\n // Use reduce to flatten the nested comments array into a single list\r\n return comments.reduce((flatComments, comment) => {\r\n // Push the current comment to the flatComments array\r\n flatComments.push(comment);\r\n // If the current comment has replies, recursively flatten them and push to the flatComments array\r\n if (comment.replies)\r\n flatComments.push(...flattenComments(comment.replies));\r\n // Return the flatComments array\r\n return flatComments;\r\n }, []);\r\n }\r\n\r\n const sortedComments = preprocessComments(json.posts);\r\n return sortedComments;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(`Failed to get comments on post.`);\r\n }\r\n };\r\n\r\n /**\r\n * Gets groups to be displayed on the \"Explore Groups\" page\r\n * @method\r\n * @returns {SidechatGroup[]}\r\n */\r\n getAvailableGroups = async () => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(`https://api.sidechat.lol/v1/groups/explore`, {\r\n method: \"GET\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n });\r\n const json = await res.json();\r\n return await json.groups;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(`Failed to get groups from explore.`);\r\n }\r\n };\r\n}\r\n\r\nexport default SidechatAPIClient;\r\n"],"names":["SidechatAPIError","_Error","message","_this","call","name","_wrapNativeSuper","Error","_catch","body","recover","result","e","then","token","_this2","this","_this3","_this4","_this5","_this6","_this7","_this8","_this9","_this10","_this11","_this12","defaultHeaders","Accept","setToken","userToken","loginViaSMS","phoneNumber","Promise","resolve","fetch","method","headers","JSON","stringify","phone_number","version","res","json","err","console","error","reject","verifySMSCode","code","toUpperCase","_json$logged_in_user","logged_in_user","setAge","age","registrationID","Number","registration_id","registerEmail","email","_extends","Authorization","checkEmailVerification","verified_email_updates_response","setDeviceID","deviceID","build_type","bundle_id","device_token","AsyncStorage","setItem","getUserAndGroup","groupID","getGroupPosts","category","cursor","setVote","postID","action","post_id","vote_status","getPostComments","preprocessComments","apiComments","commentMap","Map","topLevelComments","forEach","comment","set","id","parentComment","get","reply_post_id","parent_post_id","replies","push","flattenComments","comments","reduce","flatComments","apply","posts","getAvailableGroups","groups"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- function e(){return e=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},e.apply(this,arguments)}class t extends Error{constructor(e){super(e),this.name="SidechatAPIError"}}class r{constructor(r=""){var o=this;this.defaultHeaders={Accept:"application/json","Content-Type":"application/json"},this.setToken=e=>{this.userToken=e},this.loginViaSMS=async function(e){try{const t=await fetch("https://api.sidechat.lol/v1/login_register",{method:"POST",headers:o.defaultHeaders,body:JSON.stringify({phone_number:`+1${e}`,version:3})});return await t.json()}catch(e){throw console.error(e),new t("Failed to request SMS verification.")}},this.verifySMSCode=async function(e,r){try{var s;const t=await fetch("https://api.sidechat.lol/v1/verify_phone_number",{method:"POST",headers:o.defaultHeaders,body:JSON.stringify({phone_number:`+1${e}`,code:r.toUpperCase()})}),i=await t.json();return null!=i&&null!=(s=i.logged_in_user)&&s.token&&(o.userToken=i.logged_in_user.token),i}catch(e){throw console.error(e),new t("Failed verify this code.")}},this.setAge=async function(e,r){if(e<13)throw new t("You're too young to use Offsides.");try{const t=await fetch("https://api.sidechat.lol/v1/complete_registration",{method:"POST",headers:o.defaultHeaders,body:JSON.stringify({age:Number(e),registration_id:r})}),s=await t.json();return s.token&&(o.userToken=s.token),s}catch(e){throw console.error(e),new t("Failed verify this code.")}},this.registerEmail=async function(r){if(!o.userToken)throw new t("User is not authenticated.");try{const s=await fetch("https://api.sidechat.lol/v2/users/register_email",{method:"POST",headers:e({},o.defaultHeaders,{Authorization:`Bearer ${o.userToken}`}),body:JSON.stringify({email:r})}),i=await s.json();if(i.message)throw new t(i.message);return i}catch(e){throw console.error(error),new t("Failed to request email verification.")}},this.checkEmailVerification=async function(){if(!o.userToken)throw new t("User is not authenticated.");try{const r=await fetch("https://api.sidechat.lol/v1/users/check_email_verified",{method:"GET",headers:e({},o.defaultHeaders,{Authorization:`Bearer ${o.userToken}`})}),s=await r.json();if(s.verified_email_updates_response)return s.verified_email_updates_response;throw new t((null==s?void 0:s.message)||"Email is not verified.")}catch(e){throw console.error(error),new t("Email is not verified.")}},this.setDeviceID=async function(r){if(!o.userToken)throw new t("User is not authenticated.");try{const t=await fetch("https://api.sidechat.lol/v1/register_device_token",{method:"POST",headers:e({},o.defaultHeaders,{Authorization:`Bearer ${o.userToken}`}),body:JSON.stringify({build_type:"release",bundle_id:"com.flowerave.sidechat",device_token:r})}),s=await t.json();return await AsyncStorage.setItem("deviceID",r),s}catch(e){throw console.error(e),new t("Failed verify this code.")}},this.getUserAndGroup=async function(r=""){if(!o.userToken)throw new t("User is not authenticated.");try{const t=await fetch(`https://api.sidechat.lol/v1/updates?group_id=${r}`,{method:"GET",headers:e({},o.defaultHeaders,{Authorization:`Bearer ${o.userToken}`})});return await t.json()}catch(e){throw console.error(e),new t("Failed to get posts from group.")}},this.getGroupPosts=async function(r,s="hot",i){if(!o.userToken)throw new t("User is not authenticated.");try{const t=await fetch(`https://api.sidechat.lol/v1/posts?group_id=${r}&type=${s}${i?"&cursor="+i:""}`,{method:"GET",headers:e({},o.defaultHeaders,{Authorization:`Bearer ${o.userToken}`})});return await t.json()}catch(e){throw console.error(e),new t("Failed to get posts from group.")}},this.setVote=async function(r,s){if(!o.userToken)throw new t("User is not authenticated.");try{const t=await fetch("https://api.sidechat.lol/v1/posts/set_vote",{method:"POST",headers:e({},o.defaultHeaders,{Authorization:`Bearer ${o.userToken}`}),body:JSON.stringify({post_id:r,vote_status:s})});return await t.json()}catch(e){throw console.error(e),new t("Failed to change the vote on post.")}},this.getPostComments=async function(r){if(!o.userToken)throw new t("User is not authenticated.");try{const s=await fetch(`https://api.sidechat.lol/v1/posts/comments/?post_id=${r}`,{method:"GET",headers:e({},o.defaultHeaders,{Authorization:`Bearer ${o.userToken}`})});function i(e){const t=new Map,r=[];return e.forEach(e=>{t.set(e.id,e);const o=t.get(e.reply_post_id);o&&e.reply_post_id!==e.parent_post_id?(o.replies||(o.replies=[]),o.replies.push(e)):r.push(e)}),a(r)}function a(e){return e.reduce((e,t)=>(e.push(t),t.replies&&e.push(...a(t.replies)),e),[])}return i((await s.json()).posts)}catch(n){throw console.error(n),new t("Failed to get comments on post.")}},this.getAvailableGroups=async function(){if(!o.userToken)throw new t("User is not authenticated.");try{const t=await fetch("https://api.sidechat.lol/v1/groups/explore",{method:"GET",headers:e({},o.defaultHeaders,{Authorization:`Bearer ${o.userToken}`})}),r=await t.json();return await r.groups}catch(e){throw console.error(e),new t("Failed to get groups from explore.")}},r&&(this.userToken=r)}}export{r as SidechatAPIClient,t as SidechatAPIError};
2
- //# sourceMappingURL=sidechat.modern.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sidechat.modern.js","sources":["../src/classes/SidechatAPIError.js","../src/classes/SidechatAPIClient.js"],"sourcesContent":["/**\r\n * Throwable error caused by the Sidechat API\r\n * @class\r\n * @extends Error\r\n */\r\nclass SidechatAPIError extends Error {\r\n constructor(message) {\r\n super(message);\r\n this.name = \"SidechatAPIError\";\r\n }\r\n}\r\n\r\nexport default SidechatAPIError;\r\n","import \"../types/SidechatTypes.js\";\r\nimport SidechatAPIError from \"../classes/SidechatAPIError.js\";\r\n\r\n/**\r\n * API client class for making requests to Sidechat's private API. You'll need to [authenticate]{@tutorial Authentication} before using most of the methods.\r\n * @class\r\n * @since 2.0.0-alpha.0\r\n */\r\nclass SidechatAPIClient {\r\n /**\r\n * User bearer token\r\n * @type {SidechatAuthToken}\r\n * */\r\n userToken;\r\n /**\r\n * Default headers for every API request\r\n * @type {Object}\r\n * @static\r\n */\r\n defaultHeaders = {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n };\r\n\r\n /**\r\n * Create a new instance of the API client\r\n * @param {SidechatAuthToken} [token] - user bearer token\r\n */\r\n constructor(token = \"\") {\r\n if (token) {\r\n this.userToken = token;\r\n }\r\n }\r\n\r\n /**\r\n * Manually set the currently signed in user's token. Generally try to avoid this and instead either pass a token to the constructor or login automatically through the auth functions\r\n * @method\r\n * @param {SidechatAuthToken} token - user bearer token\r\n */\r\n setToken = (token) => {\r\n this.userToken = token;\r\n };\r\n\r\n /**\r\n * Initiate the login process with a phone number. Should be followed up with verifySMSCode().\r\n * @method\r\n * @param {Number} phoneNumber - US phone number (WITHOUT +1) to send verification code to\r\n */\r\n loginViaSMS = async (phoneNumber) => {\r\n try {\r\n const res = await fetch(`https://api.sidechat.lol/v1/login_register`, {\r\n method: \"POST\",\r\n headers: this.defaultHeaders,\r\n body: JSON.stringify({\r\n phone_number: `+1${phoneNumber}`,\r\n version: 3,\r\n }),\r\n });\r\n const json = await res.json();\r\n return json;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(\"Failed to request SMS verification.\");\r\n }\r\n };\r\n\r\n /**\r\n * Verify the code sent via SMS with loginViaSMS().\r\n * @method\r\n * @param {Number} phoneNumber - US phone number (WITHOUT +1) that verification code was sent to\r\n * @param {String} code - the verification code\r\n */\r\n verifySMSCode = async (phoneNumber, code) => {\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v1/verify_phone_number`,\r\n {\r\n method: \"POST\",\r\n headers: this.defaultHeaders,\r\n body: JSON.stringify({\r\n phone_number: `+1${phoneNumber}`,\r\n code: code.toUpperCase(),\r\n }),\r\n }\r\n );\r\n const json = await res.json();\r\n if (json?.logged_in_user?.token) {\r\n this.userToken = json.logged_in_user.token;\r\n }\r\n return json;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(\"Failed verify this code.\");\r\n }\r\n };\r\n\r\n /**\r\n * Set the user's age\r\n * @method\r\n * @param {Number} age - user's age in years\r\n * @param {String} registrationID - the registration ID generated by verifySMSCode()\r\n */\r\n setAge = async (age, registrationID) => {\r\n if (age < 13) {\r\n throw new SidechatAPIError(\"You're too young to use Offsides.\");\r\n }\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v1/complete_registration`,\r\n {\r\n method: \"POST\",\r\n headers: this.defaultHeaders,\r\n body: JSON.stringify({\r\n age: Number(age),\r\n registration_id: registrationID,\r\n }),\r\n }\r\n );\r\n const json = await res.json();\r\n if (json.token) {\r\n this.userToken = json.token;\r\n }\r\n return json;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(\"Failed verify this code.\");\r\n }\r\n };\r\n\r\n /**\r\n * Initiate the email setup process. Should be followed up with checkEmailVerification().\r\n * @method\r\n * @param {String} email - school email address to send verification code to\r\n * @tutorial Email Registration\r\n */\r\n registerEmail = async (email) => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v2/users/register_email`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n body: JSON.stringify({\r\n email: email,\r\n }),\r\n }\r\n );\r\n const json = await res.json();\r\n if (json.message) {\r\n throw new SidechatAPIError(json.message);\r\n }\r\n return json;\r\n } catch (err) {\r\n console.error(error);\r\n throw new SidechatAPIError(\"Failed to request email verification.\");\r\n }\r\n };\r\n\r\n /**\r\n * Check is the user's email is verified.\r\n * @method\r\n */\r\n checkEmailVerification = async () => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v1/users/check_email_verified`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n }\r\n );\r\n const json = await res.json();\r\n if (json.verified_email_updates_response) {\r\n return json.verified_email_updates_response;\r\n } else {\r\n throw new SidechatAPIError(json?.message || \"Email is not verified.\");\r\n }\r\n } catch (err) {\r\n console.error(error);\r\n throw new SidechatAPIError(\"Email is not verified.\");\r\n }\r\n };\r\n\r\n /**\r\n * Set the device ID of the current user\r\n * @method\r\n * @param {String} deviceId - the device ID to set\r\n */\r\n setDeviceID = async (deviceID) => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v1/register_device_token`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n body: JSON.stringify({\r\n build_type: \"release\",\r\n bundle_id: \"com.flowerave.sidechat\",\r\n device_token: deviceID,\r\n }),\r\n }\r\n );\r\n const json = await res.json();\r\n await AsyncStorage.setItem(\"deviceID\", deviceID);\r\n return json;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(\"Failed verify this code.\");\r\n }\r\n };\r\n\r\n /**\r\n * Get updated status for user and group\r\n * @method\r\n * @param {String} [groupID] - ID of a specific group to retrieve info from\r\n */\r\n getUserAndGroup = async (groupID = \"\") => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v1/updates?group_id=${groupID}`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n }\r\n );\r\n const json = await res.json();\r\n return json;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(`Failed to get posts from group.`);\r\n }\r\n };\r\n\r\n /**\r\n * Fetches posts from the specified category in a group\r\n * @method\r\n * @param {String} groupID - group ID\r\n * @param {\"hot\"|\"recent\"|\"top\"} category - category to filter posts\r\n * @param {SidechatCursorString} [cursor] - cursor string\r\n * @returns {SidechatPostsAndCursor} List of posts and cursor\r\n */\r\n getGroupPosts = async (groupID, category = \"hot\", cursor) => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v1/posts?group_id=${groupID}&type=${category}${\r\n cursor ? \"&cursor=\" + cursor : \"\"\r\n }`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n }\r\n );\r\n const json = await res.json();\r\n return json;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(`Failed to get posts from group.`);\r\n }\r\n };\r\n\r\n /**\r\n * Upvote or downvote, or unvote a post\r\n * @method\r\n * @param {String} postID - post ID to vote on\r\n * @param {SidechatVoteString} action - whether to upvote, downvote, or reset vote\r\n */\r\n setVote = async (postID, action) => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(`https://api.sidechat.lol/v1/posts/set_vote`, {\r\n method: \"POST\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n body: JSON.stringify({\r\n post_id: postID,\r\n vote_status: action,\r\n }),\r\n });\r\n const json = await res.json();\r\n return json;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(`Failed to change the vote on post.`);\r\n }\r\n };\r\n\r\n /**\r\n * Get all the commments on a post\r\n * @method\r\n * @param {String} postID - post ID to get comments for\r\n * @returns {SidechatPostOrComment[]} list of comments\r\n */\r\n getPostComments = async (postID) => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(\r\n `https://api.sidechat.lol/v1/posts/comments/?post_id=${postID}`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n }\r\n );\r\n const json = await res.json();\r\n // Function to preprocess the comments and organize them into a nested structure\r\n function preprocessComments(apiComments) {\r\n // Map to store comments by their IDs for efficient lookup\r\n const commentMap = new Map();\r\n // List to store top-level comments\r\n const topLevelComments = [];\r\n\r\n // Iterate through the API comments\r\n apiComments.forEach((comment) => {\r\n // Store the comment in the map with its ID as the key\r\n commentMap.set(comment.id, comment);\r\n // Get the parent comment using the reply_post_id\r\n const parentComment = commentMap.get(comment.reply_post_id);\r\n // Check if the comment is a top-level comment\r\n if (\r\n !parentComment ||\r\n comment.reply_post_id === comment.parent_post_id\r\n ) {\r\n // If it's a top-level comment, push it to the topLevelComments array\r\n topLevelComments.push(comment);\r\n } else {\r\n // If it's a reply, add it to the parent comment's replies array\r\n if (!parentComment.replies) parentComment.replies = [];\r\n parentComment.replies.push(comment);\r\n }\r\n });\r\n\r\n // Flatten the nested structure and return a single list of comments\r\n return flattenComments(topLevelComments);\r\n }\r\n\r\n // Function to flatten nested comments into a single list\r\n function flattenComments(comments) {\r\n // Use reduce to flatten the nested comments array into a single list\r\n return comments.reduce((flatComments, comment) => {\r\n // Push the current comment to the flatComments array\r\n flatComments.push(comment);\r\n // If the current comment has replies, recursively flatten them and push to the flatComments array\r\n if (comment.replies)\r\n flatComments.push(...flattenComments(comment.replies));\r\n // Return the flatComments array\r\n return flatComments;\r\n }, []);\r\n }\r\n\r\n const sortedComments = preprocessComments(json.posts);\r\n return sortedComments;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(`Failed to get comments on post.`);\r\n }\r\n };\r\n\r\n /**\r\n * Gets groups to be displayed on the \"Explore Groups\" page\r\n * @method\r\n * @returns {SidechatGroup[]}\r\n */\r\n getAvailableGroups = async () => {\r\n if (!this.userToken) {\r\n throw new SidechatAPIError(\"User is not authenticated.\");\r\n }\r\n try {\r\n const res = await fetch(`https://api.sidechat.lol/v1/groups/explore`, {\r\n method: \"GET\",\r\n headers: {\r\n ...this.defaultHeaders,\r\n Authorization: `Bearer ${this.userToken}`,\r\n },\r\n });\r\n const json = await res.json();\r\n return await json.groups;\r\n } catch (err) {\r\n console.error(err);\r\n throw new SidechatAPIError(`Failed to get groups from explore.`);\r\n }\r\n };\r\n}\r\n\r\nexport default SidechatAPIClient;\r\n"],"names":["SidechatAPIError","Error","constructor","message","super","this","name","SidechatAPIClient","token","_this","defaultHeaders","Accept","setToken","userToken","loginViaSMS","async","phoneNumber","res","fetch","method","headers","body","JSON","stringify","phone_number","version","json","err","console","error","verifySMSCode","code","_json$logged_in_user","toUpperCase","logged_in_user","setAge","age","registrationID","Number","registration_id","registerEmail","email","_extends","Authorization","checkEmailVerification","verified_email_updates_response","setDeviceID","deviceID","build_type","bundle_id","device_token","AsyncStorage","setItem","getUserAndGroup","groupID","getGroupPosts","category","cursor","setVote","postID","action","post_id","vote_status","getPostComments","preprocessComments","apiComments","commentMap","Map","topLevelComments","forEach","comment","set","id","parentComment","get","reply_post_id","parent_post_id","replies","push","flattenComments","comments","reduce","flatComments","posts","getAvailableGroups","groups"],"mappings":"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"}