break out browser and helper methods

This commit is contained in:
Alec Armbruster 2023-06-16 17:25:53 -04:00
parent 0854af3794
commit 976ed12d07
No known key found for this signature in database
GPG key ID: 0BE3206ADE0F3B3B
25 changed files with 104 additions and 103 deletions

View 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";

View 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;

View 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";

View 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>;

View 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";

View 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";

View 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";

View 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";

View 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";

View 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";

View 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";

View 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";

View 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";

View file

@ -1,4 +1,4 @@
import { isBrowser } from "./utils";
import { isBrowser } from "./utils/browser/is-browser";
const testHost = "0.0.0.0:8536";

View 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;

View 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);
}

View file

@ -0,0 +1,5 @@
import { isBrowser } from "./is-browser";
export function canShare() {
return isBrowser() && !!navigator.canShare;
}

View file

@ -0,0 +1,3 @@
export function isBrowser() {
return typeof window !== "undefined";
}

View file

@ -0,0 +1,7 @@
import { isBrowser } from "./is-browser";
export function share(shareData: ShareData) {
if (isBrowser()) {
navigator.share(shareData);
}
}

View file

@ -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;
}

View file

@ -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}`,
"?"
);
}

View file

@ -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[] });

View file

@ -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);
}

View file

@ -0,0 +1,3 @@
export function sleep(millis: number): Promise<void> {
return new Promise(resolve => setTimeout(resolve, millis));
}

View file

@ -0,0 +1,3 @@
export type QueryParams<T extends Record<string, any>> = {
[key in keyof T]?: string;
};