break out browser and helper methods
authorAlec Armbruster <alectrocute@gmail.com>
Fri, 16 Jun 2023 21:25:53 +0000 (17:25 -0400)
committerAlec Armbruster <alectrocute@gmail.com>
Fri, 16 Jun 2023 21:25:53 +0000 (17:25 -0400)
25 files changed:
src/shared/components/app/navbar.tsx
src/shared/components/common/markdown-textarea.tsx
src/shared/components/community/communities.tsx
src/shared/components/community/community.tsx
src/shared/components/home/home.tsx
src/shared/components/home/login.tsx
src/shared/components/home/signup.tsx
src/shared/components/modlog.tsx
src/shared/components/person/profile.tsx
src/shared/components/post/create-post.tsx
src/shared/components/post/post-listing.tsx
src/shared/components/post/post.tsx
src/shared/components/search.tsx
src/shared/env.ts
src/shared/services/UserService.ts
src/shared/utils.ts
src/shared/utils/browser/can-share.ts [new file with mode: 0644]
src/shared/utils/browser/is-browser.ts [new file with mode: 0644]
src/shared/utils/browser/share.ts [new file with mode: 0644]
src/shared/utils/helpers/get-query-params.ts [new file with mode: 0644]
src/shared/utils/helpers/get-query-string.ts [new file with mode: 0644]
src/shared/utils/helpers/group-by.ts [new file with mode: 0644]
src/shared/utils/helpers/poll.ts [new file with mode: 0644]
src/shared/utils/helpers/sleep.ts [new file with mode: 0644]
src/shared/utils/types/query-params.ts [new file with mode: 0644]

index 8c7c9202f4cc10045494aa81897cd8fe433ec0df..20d4f251411d10562300d29596b8937d306b4862 100644 (file)
@@ -11,14 +11,14 @@ import { UserService } from "../../services";
 import { HttpService, RequestState } from "../../services/HttpService";
 import {
   donateLemmyUrl,
-  isBrowser,
   myAuth,
   numToSI,
-  poll,
   showAvatars,
   toast,
   updateUnreadCountsInterval,
 } from "../../utils";
+import { isBrowser } from "../../utils/browser/is-browser";
+import { poll } from "../../utils/helpers/poll";
 import { amAdmin } from "../../utils/roles/am-admin";
 import { canCreateCommunity } from "../../utils/roles/can-create-community";
 import { Icon } from "../common/icon";
index 9318d3bb8f972b25b19a48711fcf05aed2ccb8b3..c1e85243352172ce0c0d9e9f11e5129a5d8555b5 100644 (file)
@@ -7,7 +7,6 @@ import { HttpService, UserService } from "../../services";
 import {
   concurrentImageUpload,
   customEmojisLookup,
-  isBrowser,
   markdownFieldCharacterLimit,
   markdownHelpUrl,
   maxUploadImages,
@@ -20,12 +19,12 @@ import {
   setupTribute,
   toast,
 } from "../../utils";
+import { isBrowser } from "../../utils/browser/is-browser";
 import { EmojiPicker } from "./emoji-picker";
 import { Icon, Spinner } from "./icon";
 import { LanguageSelect } from "./language-select";
 import NavigationPrompt from "./navigation-prompt";
 import ProgressBar from "./progress-bar";
-
 interface MarkdownTextAreaProps {
   initialContent?: string;
   initialLanguageId?: number;
index 623269439f8642444aad0fcaa6cb8cdb0649d02d..b98bf251ca76852e88c9908294bdc773a2db7143 100644 (file)
@@ -11,17 +11,17 @@ import { InitialFetchRequest } from "../../interfaces";
 import { FirstLoadService } from "../../services/FirstLoadService";
 import { HttpService, RequestState } from "../../services/HttpService";
 import {
-  QueryParams,
   editCommunity,
   getPageFromString,
-  getQueryParams,
-  getQueryString,
   myAuth,
   myAuthRequired,
   numToSI,
   setIsoData,
   showLocal,
 } from "../../utils";
+import { getQueryParams } from "../../utils/helpers/get-query-params";
+import { getQueryString } from "../../utils/helpers/get-query-string";
+import type { QueryParams } from "../../utils/types/query-params";
 import { HtmlTags } from "../common/html-tags";
 import { Spinner } from "../common/icon";
 import { ListingTypeSelect } from "../common/listing-type-select";
index 7dc150f332fd89b40a8635c79e526ffa53e3b3ed..cb7e95173766d330a08303b04be031665d0fcf96 100644 (file)
@@ -62,7 +62,6 @@ import { UserService } from "../../services";
 import { FirstLoadService } from "../../services/FirstLoadService";
 import { HttpService, RequestState } from "../../services/HttpService";
 import {
-  QueryParams,
   commentsToFlatNodes,
   communityRSSUrl,
   editComment,
@@ -74,8 +73,6 @@ import {
   getCommentParentId,
   getDataTypeString,
   getPageFromString,
-  getQueryParams,
-  getQueryString,
   myAuth,
   postToCommentSortType,
   relTags,
@@ -88,6 +85,9 @@ import {
   updateCommunityBlock,
   updatePersonBlock,
 } from "../../utils";
+import { getQueryParams } from "../../utils/helpers/get-query-params";
+import { getQueryString } from "../../utils/helpers/get-query-string";
+import type { QueryParams } from "../../utils/types/query-params";
 import { CommentNodes } from "../comment/comment-nodes";
 import { BannerIconHeader } from "../common/banner-icon-header";
 import { DataTypeSelect } from "../common/data-type-select";
@@ -99,7 +99,6 @@ import { Sidebar } from "../community/sidebar";
 import { SiteSidebar } from "../home/site-sidebar";
 import { PostListings } from "../post/post-listings";
 import { CommunityLink } from "./community-link";
-
 interface State {
   communityRes: RequestState<GetCommunityResponse>;
   postsRes: RequestState<GetPostsResponse>;
index 4e23c03c96ddea5a803a422c3f5c4c16becc3fe0..ed3afd01aca849907dfe3c26c4cf9adc7eb7e31c 100644 (file)
@@ -67,13 +67,10 @@ import {
   getCommentParentId,
   getDataTypeString,
   getPageFromString,
-  getQueryParams,
-  getQueryString,
   getRandomFromList,
   mdToHtml,
   myAuth,
   postToCommentSortType,
-  QueryParams,
   relTags,
   restoreScrollPosition,
   saveScrollPosition,
@@ -84,7 +81,10 @@ import {
   trendingFetchLimit,
   updatePersonBlock,
 } from "../../utils";
+import { getQueryParams } from "../../utils/helpers/get-query-params";
+import { getQueryString } from "../../utils/helpers/get-query-string";
 import { canCreateCommunity } from "../../utils/roles/can-create-community";
+import type { QueryParams } from "../../utils/types/query-params";
 import { CommentNodes } from "../comment/comment-nodes";
 import { DataTypeSelect } from "../common/data-type-select";
 import { HtmlTags } from "../common/html-tags";
index 381c13bb0ce05dac89f5b3068009f5c59940c0d7..d7e20ec7804c8fc13c0d50bd799cce63cc0f9fc7 100644 (file)
@@ -3,7 +3,8 @@ import { GetSiteResponse, LoginResponse } from "lemmy-js-client";
 import { i18n } from "../../i18next";
 import { UserService } from "../../services";
 import { HttpService, RequestState } from "../../services/HttpService";
-import { isBrowser, myAuth, setIsoData, toast, validEmail } from "../../utils";
+import { myAuth, setIsoData, toast, validEmail } from "../../utils";
+import { isBrowser } from "../../utils/browser/is-browser";
 import { HtmlTags } from "../common/html-tags";
 import { Spinner } from "../common/icon";
 
index 16a3cc6d3eef61dbb4624a6acdefaf90429b3009..192393db98bee758eaab96cdc050ff13936d87df 100644 (file)
@@ -13,7 +13,6 @@ import { i18n } from "../../i18next";
 import { UserService } from "../../services";
 import { HttpService, RequestState } from "../../services/HttpService";
 import {
-  isBrowser,
   joinLemmyUrl,
   mdToHtml,
   myAuth,
@@ -21,6 +20,7 @@ import {
   toast,
   validEmail,
 } from "../../utils";
+import { isBrowser } from "../../utils/browser/is-browser";
 import { HtmlTags } from "../common/html-tags";
 import { Icon, Spinner } from "../common/icon";
 import { MarkdownTextArea } from "../common/markdown-textarea";
index 4ab5ec563fd2339a54eff06e8901f9ae356c4e65..cd0cfcb9cc5d1f2c4085fd578e494841651c79bc 100644 (file)
@@ -33,21 +33,21 @@ import { FirstLoadService } from "../services/FirstLoadService";
 import { HttpService, RequestState } from "../services/HttpService";
 import {
   Choice,
-  QueryParams,
   debounce,
   fetchLimit,
   fetchUsers,
   getIdFromString,
   getPageFromString,
-  getQueryParams,
-  getQueryString,
   getUpdatedSearchId,
   myAuth,
   personToChoice,
   setIsoData,
 } from "../utils";
+import { getQueryParams } from "../utils/helpers/get-query-params";
+import { getQueryString } from "../utils/helpers/get-query-string";
 import { amAdmin } from "../utils/roles/am-admin";
 import { amMod } from "../utils/roles/am-mod";
+import type { QueryParams } from "../utils/types/query-params";
 import { HtmlTags } from "./common/html-tags";
 import { Icon, Spinner } from "./common/icon";
 import { MomentTime } from "./common/moment-time";
index 4d9f8f77bf1946ae34f1357c6ece409c2b5846c0..c12114bc8f3d8e4fa2ccfb32dfdfb897b7dbad37 100644 (file)
@@ -53,7 +53,6 @@ import { UserService } from "../../services";
 import { FirstLoadService } from "../../services/FirstLoadService";
 import { HttpService, RequestState } from "../../services/HttpService";
 import {
-  QueryParams,
   capitalizeFirstLetter,
   editComment,
   editPost,
@@ -64,8 +63,6 @@ import {
   futureDaysToUnixTime,
   getCommentParentId,
   getPageFromString,
-  getQueryParams,
-  getQueryString,
   mdToHtml,
   myAuth,
   myAuthRequired,
@@ -78,9 +75,12 @@ import {
   toast,
   updatePersonBlock,
 } from "../../utils";
+import { getQueryParams } from "../../utils/helpers/get-query-params";
+import { getQueryString } from "../../utils/helpers/get-query-string";
 import { canMod } from "../../utils/roles/can-mod";
 import { isAdmin } from "../../utils/roles/is-admin";
 import { isBanned } from "../../utils/roles/is-banned";
+import type { QueryParams } from "../../utils/types/query-params";
 import { BannerIconHeader } from "../common/banner-icon-header";
 import { HtmlTags } from "../common/html-tags";
 import { Icon, Spinner } from "../common/icon";
index 71fac79aed8668bc9f694df463ee884628eb8419..ed1df4c1c8692fb4ecf202d6741e12f49b1346e5 100644 (file)
@@ -16,14 +16,14 @@ import {
 } from "../../services/HttpService";
 import {
   Choice,
-  QueryParams,
   enableDownvotes,
   enableNsfw,
   getIdFromString,
-  getQueryParams,
   myAuth,
   setIsoData,
 } from "../../utils";
+import { getQueryParams } from "../../utils/helpers/get-query-params";
+import type { QueryParams } from "../../utils/types/query-params";
 import { HtmlTags } from "../common/html-tags";
 import { Spinner } from "../common/icon";
 import { PostForm } from "./post-form";
index 3ec1a456704d503d732a46b962157eedc8924728..4c36f6511cbe4120c6a165b630362ba08eda68fe 100644 (file)
@@ -28,7 +28,6 @@ import { i18n } from "../../i18next";
 import { BanType, PostFormParams, PurgeType, VoteType } from "../../interfaces";
 import { UserService } from "../../services";
 import {
-  canShare,
   futureDaysToUnixTime,
   hostname,
   isImage,
@@ -41,9 +40,10 @@ import {
   numToSI,
   relTags,
   setupTippy,
-  share,
   showScores,
 } from "../../utils";
+import { canShare } from "../../utils/browser/can-share";
+import { share } from "../../utils/browser/share";
 import { amAdmin } from "../../utils/roles/am-admin";
 import { amCommunityCreator } from "../../utils/roles/am-community-creator";
 import { amMod } from "../../utils/roles/am-mod";
index 9c68532bee5122c816ae12d4a48f12375b7c265e..250c08a745db83f99b89c94c2d03a42e8e777671 100644 (file)
@@ -73,7 +73,6 @@ import {
   getCommentParentId,
   getDepthFromComment,
   getIdFromProps,
-  isBrowser,
   isImage,
   myAuth,
   restoreScrollPosition,
@@ -84,6 +83,7 @@ import {
   updateCommunityBlock,
   updatePersonBlock,
 } from "../../utils";
+import { isBrowser } from "../../utils/browser/is-browser";
 import { CommentForm } from "../comment/comment-form";
 import { CommentNodes } from "../comment/comment-nodes";
 import { HtmlTags } from "../common/html-tags";
index 8097dbde433b7ac7ef3811e47cc44cd6d4ffe76b..59bbf616ca5768e65f169be4a4309bb50bbdf23a 100644 (file)
@@ -26,7 +26,6 @@ import { FirstLoadService } from "../services/FirstLoadService";
 import { HttpService, RequestState } from "../services/HttpService";
 import {
   Choice,
-  QueryParams,
   capitalizeFirstLetter,
   commentsToFlatNodes,
   communityToChoice,
@@ -38,8 +37,6 @@ import {
   fetchUsers,
   getIdFromString,
   getPageFromString,
-  getQueryParams,
-  getQueryString,
   getUpdatedSearchId,
   myAuth,
   numToSI,
@@ -49,6 +46,9 @@ import {
   setIsoData,
   showLocal,
 } from "../utils";
+import { getQueryParams } from "../utils/helpers/get-query-params";
+import { getQueryString } from "../utils/helpers/get-query-string";
+import type { QueryParams } from "../utils/types/query-params";
 import { CommentNodes } from "./comment/comment-nodes";
 import { HtmlTags } from "./common/html-tags";
 import { Spinner } from "./common/icon";
index 576c6c58e916f9d9274bd40200555a9892a8b19c..969f8761241d22e6d80141e4ff133a31434bb7aa 100644 (file)
@@ -1,4 +1,4 @@
-import { isBrowser } from "./utils";
+import { isBrowser } from "./utils/browser/is-browser";
 
 const testHost = "0.0.0.0:8536";
 
index 57c8aecf710c4717f58de4b3b1adeffe84957adb..8f553aba2395aa1c57c8985c225a36b6ce6240a3 100644 (file)
@@ -4,7 +4,8 @@ import jwt_decode from "jwt-decode";
 import { LoginResponse, MyUserInfo } from "lemmy-js-client";
 import { isHttps } from "../env";
 import { i18n } from "../i18next";
-import { isAuthPath, isBrowser, toast } from "../utils";
+import { isAuthPath, toast } from "../utils";
+import { isBrowser } from "../utils/browser/is-browser";
 
 interface Claims {
   sub: number;
index b1b06e2ec0a8ba6cc804618b2854b7554288cc26..54b5a3f4ac37aa6f448fbf677125f34db142356f 100644 (file)
@@ -43,6 +43,8 @@ import { getHttpBase } from "./env";
 import { i18n, languages } from "./i18next";
 import { CommentNodeI, DataType, IsoData, VoteType } from "./interfaces";
 import { HttpService, UserService } from "./services";
+import { isBrowser } from "./utils/browser/is-browser";
+import { groupBy } from "./utils/helpers/group-by";
 
 let Tribute: any;
 if (isBrowser()) {
@@ -1070,10 +1072,6 @@ export function siteBannerCss(banner: string): string {
     `;
 }
 
-export function isBrowser() {
-  return typeof window !== "undefined";
-}
-
 export function setIsoData(context: any): IsoData {
   // If its the browser, you need to deserialize the data from the window
   if (isBrowser()) {
@@ -1314,64 +1312,12 @@ interface EmojiMartSkin {
   src: string;
 }
 
-const groupBy = <T>(
-  array: T[],
-  predicate: (value: T, index: number, array: T[]) => string
-) =>
-  array.reduce((acc, value, index, array) => {
-    (acc[predicate(value, index, array)] ||= []).push(value);
-    return acc;
-  }, {} as { [key: string]: T[] });
-
-export type QueryParams<T extends Record<string, any>> = {
-  [key in keyof T]?: string;
-};
-
-export function getQueryParams<T extends Record<string, any>>(processors: {
-  [K in keyof T]: (param: string) => T[K];
-}): T {
-  if (isBrowser()) {
-    const searchParams = new URLSearchParams(window.location.search);
-
-    return Array.from(Object.entries(processors)).reduce(
-      (acc, [key, process]) => ({
-        ...acc,
-        [key]: process(searchParams.get(key)),
-      }),
-      {} as T
-    );
-  }
-
-  return {} as T;
-}
-
-export function getQueryString<T extends Record<string, string | undefined>>(
-  obj: T
-) {
-  return Object.entries(obj)
-    .filter(([, val]) => val !== undefined && val !== null)
-    .reduce(
-      (acc, [key, val], index) => `${acc}${index > 0 ? "&" : ""}${key}=${val}`,
-      "?"
-    );
-}
-
 export function isAuthPath(pathname: string) {
   return /create_.*|inbox|settings|admin|reports|registration_applications/g.test(
     pathname
   );
 }
 
-export function canShare() {
-  return isBrowser() && !!navigator.canShare;
-}
-
-export function share(shareData: ShareData) {
-  if (isBrowser()) {
-    navigator.share(shareData);
-  }
-}
-
 export function newVote(voteType: VoteType, myVote?: number): number {
   if (voteType == VoteType.Upvote) {
     return myVote == 1 ? 0 : 1;
@@ -1379,18 +1325,3 @@ export function newVote(voteType: VoteType, myVote?: number): number {
     return myVote == -1 ? 0 : -1;
   }
 }
-
-function sleep(millis: number): Promise<void> {
-  return new Promise(resolve => setTimeout(resolve, millis));
-}
-
-/**
- * Polls / repeatedly runs a promise, every X milliseconds
- */
-export async function poll(promiseFn: any, millis: number) {
-  if (window.document.visibilityState !== "hidden") {
-    await promiseFn();
-  }
-  await sleep(millis);
-  return poll(promiseFn, millis);
-}
diff --git a/src/shared/utils/browser/can-share.ts b/src/shared/utils/browser/can-share.ts
new file mode 100644 (file)
index 0000000..bec7e80
--- /dev/null
@@ -0,0 +1,5 @@
+import { isBrowser } from "./is-browser";
+
+export function canShare() {
+  return isBrowser() && !!navigator.canShare;
+}
diff --git a/src/shared/utils/browser/is-browser.ts b/src/shared/utils/browser/is-browser.ts
new file mode 100644 (file)
index 0000000..4139b25
--- /dev/null
@@ -0,0 +1,3 @@
+export function isBrowser() {
+  return typeof window !== "undefined";
+}
diff --git a/src/shared/utils/browser/share.ts b/src/shared/utils/browser/share.ts
new file mode 100644 (file)
index 0000000..b1d1b5b
--- /dev/null
@@ -0,0 +1,7 @@
+import { isBrowser } from "./is-browser";
+
+export function share(shareData: ShareData) {
+  if (isBrowser()) {
+    navigator.share(shareData);
+  }
+}
diff --git a/src/shared/utils/helpers/get-query-params.ts b/src/shared/utils/helpers/get-query-params.ts
new file mode 100644 (file)
index 0000000..213d352
--- /dev/null
@@ -0,0 +1,19 @@
+import { isBrowser } from "../browser/is-browser";
+
+export function getQueryParams<T extends Record<string, any>>(processors: {
+  [K in keyof T]: (param: string) => T[K];
+}): T {
+  if (isBrowser()) {
+    const searchParams = new URLSearchParams(window.location.search);
+
+    return Array.from(Object.entries(processors)).reduce(
+      (acc, [key, process]) => ({
+        ...acc,
+        [key]: process(searchParams.get(key)),
+      }),
+      {} as T
+    );
+  }
+
+  return {} as T;
+}
diff --git a/src/shared/utils/helpers/get-query-string.ts b/src/shared/utils/helpers/get-query-string.ts
new file mode 100644 (file)
index 0000000..a66b5af
--- /dev/null
@@ -0,0 +1,10 @@
+export function getQueryString<T extends Record<string, string | undefined>>(
+  obj: T
+) {
+  return Object.entries(obj)
+    .filter(([, val]) => val !== undefined && val !== null)
+    .reduce(
+      (acc, [key, val], index) => `${acc}${index > 0 ? "&" : ""}${key}=${val}`,
+      "?"
+    );
+}
diff --git a/src/shared/utils/helpers/group-by.ts b/src/shared/utils/helpers/group-by.ts
new file mode 100644 (file)
index 0000000..4dd5d5d
--- /dev/null
@@ -0,0 +1,8 @@
+export const groupBy = <T>(
+  array: T[],
+  predicate: (value: T, index: number, array: T[]) => string
+) =>
+  array.reduce((acc, value, index, array) => {
+    (acc[predicate(value, index, array)] ||= []).push(value);
+    return acc;
+  }, {} as { [key: string]: T[] });
diff --git a/src/shared/utils/helpers/poll.ts b/src/shared/utils/helpers/poll.ts
new file mode 100644 (file)
index 0000000..055f17f
--- /dev/null
@@ -0,0 +1,12 @@
+import { sleep } from "./sleep";
+
+/**
+ * Polls / repeatedly runs a promise, every X milliseconds
+ */
+export async function poll(promiseFn: any, millis: number) {
+  if (window.document.visibilityState !== "hidden") {
+    await promiseFn();
+  }
+  await sleep(millis);
+  return poll(promiseFn, millis);
+}
diff --git a/src/shared/utils/helpers/sleep.ts b/src/shared/utils/helpers/sleep.ts
new file mode 100644 (file)
index 0000000..5b7c538
--- /dev/null
@@ -0,0 +1,3 @@
+export function sleep(millis: number): Promise<void> {
+  return new Promise(resolve => setTimeout(resolve, millis));
+}
diff --git a/src/shared/utils/types/query-params.ts b/src/shared/utils/types/query-params.ts
new file mode 100644 (file)
index 0000000..37705bd
--- /dev/null
@@ -0,0 +1,3 @@
+export type QueryParams<T extends Record<string, any>> = {
+  [key in keyof T]?: string;
+};