diff --git a/package.json b/package.json index 1055d853..9e7a0f1b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lemmy-ui", - "version": "0.18.0-rc.5", + "version": "0.18.0-rc.6", "description": "An isomorphic UI for lemmy", "repository": "https://github.com/LemmyNet/lemmy-ui", "license": "AGPL-3.0", diff --git a/src/server/handlers/catch-all-handler.tsx b/src/server/handlers/catch-all-handler.tsx index b9ff13bf..f22b8a17 100644 --- a/src/server/handlers/catch-all-handler.tsx +++ b/src/server/handlers/catch-all-handler.tsx @@ -1,12 +1,13 @@ import { initializeSite, isAuthPath } from "@utils/app"; +import { getHttpBaseInternal } from "@utils/env"; import { ErrorPageData } from "@utils/types"; +import fetch from "cross-fetch"; import type { Request, Response } from "express"; import { StaticRouter, matchPath } from "inferno-router"; import { renderToString } from "inferno-server"; import IsomorphicCookie from "isomorphic-cookie"; import { GetSite, GetSiteResponse, LemmyHttp } from "lemmy-js-client"; import { App } from "../../shared/components/app/app"; -import { getHttpBaseInternal } from "../../shared/env"; import { InitialFetchRequest, IsoDataOptionalSite, diff --git a/src/server/handlers/manifest-handler.ts b/src/server/handlers/manifest-handler.ts index 6858cffd..c1756f75 100644 --- a/src/server/handlers/manifest-handler.ts +++ b/src/server/handlers/manifest-handler.ts @@ -1,6 +1,7 @@ +import { getHttpBaseExternal, getHttpBaseInternal } from "@utils/env"; +import fetch from "cross-fetch"; import type { Request, Response } from "express"; import { LemmyHttp } from "lemmy-js-client"; -import { getHttpBaseExternal, getHttpBaseInternal } from "../../shared/env"; import { wrapClient } from "../../shared/services/HttpService"; import generateManifestJson from "../utils/generate-manifest-json"; import { setForwardedHeaders } from "../utils/set-forwarded-headers"; diff --git a/src/server/utils/build-themes-list.ts b/src/server/utils/build-themes-list.ts index 73dc53bc..74b910c7 100644 --- a/src/server/utils/build-themes-list.ts +++ b/src/server/utils/build-themes-list.ts @@ -4,15 +4,20 @@ import { readdir } from "fs/promises"; const extraThemesFolder = process.env["LEMMY_UI_EXTRA_THEMES_FOLDER"] || "./extra_themes"; -const themes = ["darkly", "darkly-red", "litely", "litely-red"]; +const themes: ReadonlyArray = [ + "darkly", + "darkly-red", + "litely", + "litely-red", +]; -export async function buildThemeList(): Promise { +export async function buildThemeList(): Promise> { if (existsSync(extraThemesFolder)) { const dirThemes = await readdir(extraThemesFolder); const cssThemes = dirThemes .filter(d => d.endsWith(".css")) .map(d => d.replace(".css", "")); - themes.push(...cssThemes); + return themes.concat(cssThemes); } return themes; } diff --git a/src/server/utils/fetch-icon-png.ts b/src/server/utils/fetch-icon-png.ts index 12b09e70..75497a21 100644 --- a/src/server/utils/fetch-icon-png.ts +++ b/src/server/utils/fetch-icon-png.ts @@ -1,3 +1,5 @@ +import fetch from "cross-fetch"; + export async function fetchIconPng(iconUrl: string) { return await fetch(iconUrl) .then(res => res.blob()) diff --git a/src/server/utils/generate-manifest-json.ts b/src/server/utils/generate-manifest-json.ts index b03fd87b..2f9d8b80 100644 --- a/src/server/utils/generate-manifest-json.ts +++ b/src/server/utils/generate-manifest-json.ts @@ -1,8 +1,8 @@ +import { getHttpBaseExternal } from "@utils/env"; import { readFile } from "fs/promises"; import { GetSiteResponse } from "lemmy-js-client"; import path from "path"; import sharp from "sharp"; -import { getHttpBaseExternal } from "../../shared/env"; import { fetchIconPng } from "./fetch-icon-png"; const iconSizes = [72, 96, 128, 144, 152, 192, 384, 512]; diff --git a/src/shared/components/common/html-tags.tsx b/src/shared/components/common/html-tags.tsx index 3a8b270a..5d532589 100644 --- a/src/shared/components/common/html-tags.tsx +++ b/src/shared/components/common/html-tags.tsx @@ -1,7 +1,7 @@ +import { httpExternalPath } from "@utils/env"; import { htmlToText } from "html-to-text"; import { Component } from "inferno"; import { Helmet } from "inferno-helmet"; -import { httpExternalPath } from "../../env"; import { md } from "../../markdown"; import { I18NextService } from "../../services"; diff --git a/src/shared/components/post/post-listing.tsx b/src/shared/components/post/post-listing.tsx index bbc02892..4d0951bb 100644 --- a/src/shared/components/post/post-listing.tsx +++ b/src/shared/components/post/post-listing.tsx @@ -1,6 +1,12 @@ import { myAuthRequired, newVote, showScores } from "@utils/app"; import { canShare, share } from "@utils/browser"; -import { futureDaysToUnixTime, hostname, numToSI } from "@utils/helpers"; +import { getExternalHost, getHttpBase } from "@utils/env"; +import { + capitalizeFirstLetter, + futureDaysToUnixTime, + hostname, + numToSI, +} from "@utils/helpers"; import { isImage, isVideo } from "@utils/media"; import { amAdmin, @@ -38,7 +44,6 @@ import { TransferCommunity, } from "lemmy-js-client"; import { relTags } from "../../config"; -import { getExternalHost, getHttpBase } from "../../env"; import { BanType, PostFormParams, PurgeType, VoteType } from "../../interfaces"; import { mdNoImages, mdToHtml, mdToHtmlInline } from "../../markdown"; import { I18NextService, UserService } from "../../services"; @@ -981,7 +986,7 @@ export class PostListing extends Component { classes={classNames("me-1", { "text-danger": locked })} inline /> - {label} + {capitalizeFirstLetter(label)} )} diff --git a/src/shared/config.ts b/src/shared/config.ts index 384e86c3..28e8ce51 100644 --- a/src/shared/config.ts +++ b/src/shared/config.ts @@ -24,3 +24,5 @@ export const updateUnreadCountsInterval = 30000; export const fetchLimit = 40; export const relTags = "noopener nofollow"; export const emDash = "\u2014"; + +export const testHost = "0.0.0.0:8536"; diff --git a/src/shared/env.ts b/src/shared/env.ts deleted file mode 100644 index 287912d1..00000000 --- a/src/shared/env.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { isBrowser } from "@utils/browser"; - -const testHost = "0.0.0.0:8536"; - -function getInternalHost() { - return !isBrowser() - ? process.env.LEMMY_UI_LEMMY_INTERNAL_HOST ?? testHost - : testHost; // used for local dev -} - -export function getExternalHost() { - return isBrowser() - ? `${window.location.hostname}${ - ["1234", "1235"].includes(window.location.port) - ? ":8536" - : window.location.port == "" - ? "" - : `:${window.location.port}` - }` - : process.env.LEMMY_UI_LEMMY_EXTERNAL_HOST || testHost; -} - -function getSecure() { - return ( - isBrowser() - ? window.location.protocol.includes("https") - : process.env.LEMMY_UI_HTTPS === "true" - ) - ? "s" - : ""; -} - -function getHost() { - return isBrowser() ? getExternalHost() : getInternalHost(); -} - -function getBaseLocal(s = "") { - return `http${s}://${getHost()}`; -} - -export function getHttpBaseInternal() { - return getBaseLocal(); // Don't use secure here -} - -export function getHttpBaseExternal() { - return `http${getSecure()}://${getExternalHost()}`; -} - -export function getHttpBase() { - return getBaseLocal(getSecure()); -} - -export function isHttps() { - return getSecure() === "s"; -} - -console.log(`httpbase: ${getHttpBase()}`); -console.log(`isHttps: ${isHttps()}`); - -// This is for html tags, don't include port -export function httpExternalPath(path: string) { - return `http${getSecure()}://${getExternalHost().replace( - /:\d+/g, - "" - )}${path}`; -} diff --git a/src/shared/services/HttpService.ts b/src/shared/services/HttpService.ts index 6f57ecb5..361ffbd3 100644 --- a/src/shared/services/HttpService.ts +++ b/src/shared/services/HttpService.ts @@ -1,5 +1,5 @@ +import { getHttpBase } from "@utils/env"; import { LemmyHttp } from "lemmy-js-client"; -import { getHttpBase } from "../../shared/env"; import { toast } from "../../shared/toast"; import { I18NextService } from "./I18NextService"; diff --git a/src/shared/services/UserService.ts b/src/shared/services/UserService.ts index df4f00a8..3d08e124 100644 --- a/src/shared/services/UserService.ts +++ b/src/shared/services/UserService.ts @@ -1,10 +1,10 @@ // import Cookies from 'js-cookie'; import { isAuthPath } from "@utils/app"; import { isBrowser } from "@utils/browser"; +import { isHttps } from "@utils/env"; import IsomorphicCookie from "isomorphic-cookie"; import jwt_decode from "jwt-decode"; import { LoginResponse, MyUserInfo } from "lemmy-js-client"; -import { isHttps } from "../env"; import { toast } from "../toast"; import { I18NextService } from "./I18NextService"; diff --git a/src/shared/utils/env/get-base-local.ts b/src/shared/utils/env/get-base-local.ts new file mode 100644 index 00000000..754d66d3 --- /dev/null +++ b/src/shared/utils/env/get-base-local.ts @@ -0,0 +1,5 @@ +import { getHost } from "@utils/env"; + +export default function getBaseLocal(s = "") { + return `http${s}://${getHost()}`; +} diff --git a/src/shared/utils/env/get-external-host.ts b/src/shared/utils/env/get-external-host.ts new file mode 100644 index 00000000..7e2635d8 --- /dev/null +++ b/src/shared/utils/env/get-external-host.ts @@ -0,0 +1,14 @@ +import { isBrowser } from "@utils/browser"; +import { testHost } from "../../config"; + +export default function getExternalHost() { + return isBrowser() + ? `${window.location.hostname}${ + ["1234", "1235"].includes(window.location.port) + ? ":8536" + : window.location.port == "" + ? "" + : `:${window.location.port}` + }` + : process.env.LEMMY_UI_LEMMY_EXTERNAL_HOST || testHost; +} diff --git a/src/shared/utils/env/get-host.ts b/src/shared/utils/env/get-host.ts new file mode 100644 index 00000000..0e361ac3 --- /dev/null +++ b/src/shared/utils/env/get-host.ts @@ -0,0 +1,6 @@ +import { isBrowser } from "@utils/browser"; +import { getExternalHost, getInternalHost } from "@utils/env"; + +export default function getHost() { + return isBrowser() ? getExternalHost() : getInternalHost(); +} diff --git a/src/shared/utils/env/get-http-base-external.ts b/src/shared/utils/env/get-http-base-external.ts new file mode 100644 index 00000000..c0ee3bb3 --- /dev/null +++ b/src/shared/utils/env/get-http-base-external.ts @@ -0,0 +1,5 @@ +import { getExternalHost, getSecure } from "@utils/env"; + +export default function getHttpBaseExternal() { + return `http${getSecure()}://${getExternalHost()}`; +} diff --git a/src/shared/utils/env/get-http-base-internal.ts b/src/shared/utils/env/get-http-base-internal.ts new file mode 100644 index 00000000..e30c14c2 --- /dev/null +++ b/src/shared/utils/env/get-http-base-internal.ts @@ -0,0 +1,5 @@ +import { getBaseLocal } from "@utils/env"; + +export default function getHttpBaseInternal() { + return getBaseLocal(); // Don't use secure here +} diff --git a/src/shared/utils/env/get-http-base.ts b/src/shared/utils/env/get-http-base.ts new file mode 100644 index 00000000..97fa0578 --- /dev/null +++ b/src/shared/utils/env/get-http-base.ts @@ -0,0 +1,5 @@ +import { getBaseLocal, getSecure } from "@utils/env"; + +export default function getHttpBase() { + return getBaseLocal(getSecure()); +} diff --git a/src/shared/utils/env/get-internal-host.ts b/src/shared/utils/env/get-internal-host.ts new file mode 100644 index 00000000..ee8fdbd3 --- /dev/null +++ b/src/shared/utils/env/get-internal-host.ts @@ -0,0 +1,8 @@ +import { isBrowser } from "@utils/browser"; +import { testHost } from "../../config"; + +export default function getInternalHost() { + return !isBrowser() + ? process.env.LEMMY_UI_LEMMY_INTERNAL_HOST ?? testHost + : testHost; // used for local dev +} diff --git a/src/shared/utils/env/get-secure.ts b/src/shared/utils/env/get-secure.ts new file mode 100644 index 00000000..7e78b4f5 --- /dev/null +++ b/src/shared/utils/env/get-secure.ts @@ -0,0 +1,11 @@ +import { isBrowser } from "@utils/browser"; + +export default function getSecure() { + return ( + isBrowser() + ? window.location.protocol.includes("https") + : process.env.LEMMY_UI_HTTPS === "true" + ) + ? "s" + : ""; +} diff --git a/src/shared/utils/env/http-external-path.ts b/src/shared/utils/env/http-external-path.ts new file mode 100644 index 00000000..f24ccace --- /dev/null +++ b/src/shared/utils/env/http-external-path.ts @@ -0,0 +1,9 @@ +import { getExternalHost, getSecure } from "@utils/env"; + +// This is for html tags, don't include port +export default function httpExternalPath(path: string) { + return `http${getSecure()}://${getExternalHost().replace( + /:\d+/g, + "" + )}${path}`; +} diff --git a/src/shared/utils/env/index.ts b/src/shared/utils/env/index.ts new file mode 100644 index 00000000..e14c6735 --- /dev/null +++ b/src/shared/utils/env/index.ts @@ -0,0 +1,23 @@ +import getBaseLocal from "./get-base-local"; +import getExternalHost from "./get-external-host"; +import getHost from "./get-host"; +import getHttpBase from "./get-http-base"; +import getHttpBaseExternal from "./get-http-base-external"; +import getHttpBaseInternal from "./get-http-base-internal"; +import getInternalHost from "./get-internal-host"; +import getSecure from "./get-secure"; +import httpExternalPath from "./http-external-path"; +import isHttps from "./is-https"; + +export { + getBaseLocal, + getExternalHost, + getHost, + getHttpBase, + getHttpBaseExternal, + getHttpBaseInternal, + getInternalHost, + getSecure, + httpExternalPath, + isHttps, +}; diff --git a/src/shared/utils/env/is-https.ts b/src/shared/utils/env/is-https.ts new file mode 100644 index 00000000..dd907570 --- /dev/null +++ b/src/shared/utils/env/is-https.ts @@ -0,0 +1,5 @@ +import { getSecure } from "@utils/env"; + +export default function isHttps() { + return getSecure() === "s"; +}