diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index 91403cb9..98289d6d 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -830,7 +830,15 @@ "admin": { "title": "Admin panel", "text": "Utilize tools made for testing P-Stream's condition.", - "button": "Check it out" + "button": "Check it out", + "extensionOverride": { + "title": "Extension Override", + "text": "Override extension detection for testing purposes. This will make the app believe the extension is active even if it's not installed.", + "button": "Enable Override", + "buttonDisabled": "Disable Override", + "enabled": "Extension override is currently enabled", + "disabled": "Extension override is currently disabled" + } }, "actions": { "delete": { diff --git a/src/backend/extension/messaging.ts b/src/backend/extension/messaging.ts index bf0e3253..54e3d48c 100644 --- a/src/backend/extension/messaging.ts +++ b/src/backend/extension/messaging.ts @@ -22,6 +22,13 @@ const isExtensionReady = new Promise((resolve) => { let activeExtension = false; +const EXTENSION_OVERRIDE_KEY = "___dev_extension_override"; + +function isExtensionOverrideEnabled(): boolean { + if (typeof window === "undefined") return false; + return localStorage.getItem(EXTENSION_OVERRIDE_KEY) === "true"; +} + async function sendMessage( message: MessageKey, payload: MessagesMetadata[MessageKey]["req"] | undefined = undefined, @@ -74,10 +81,12 @@ export async function extensionInfo(): Promise< } export function isExtensionActiveCached(): boolean { + if (isExtensionOverrideEnabled()) return true; return activeExtension; } export async function isExtensionActive(): Promise { + if (isExtensionOverrideEnabled()) return true; const info = await extensionInfo(); if (!info?.success) return false; const allowedVersion = isAllowedExtensionVersion(info.version); diff --git a/src/pages/admin/AdminPage.tsx b/src/pages/admin/AdminPage.tsx index ebac03a1..98a9f560 100644 --- a/src/pages/admin/AdminPage.tsx +++ b/src/pages/admin/AdminPage.tsx @@ -2,6 +2,7 @@ import { ThinContainer } from "@/components/layout/ThinContainer"; import { Heading1, Paragraph } from "@/components/utils/Text"; import { SubPageLayout } from "@/pages/layouts/SubPageLayout"; import { ConfigValuesPart } from "@/pages/parts/admin/ConfigValuesPart"; +import { ExtensionOverridePart } from "@/pages/parts/admin/ExtensionOverridePart"; import { RegionSelectorPart } from "@/pages/parts/admin/RegionSelectorPart"; import { TMDBTestPart } from "@/pages/parts/admin/TMDBTestPart"; import { WorkerTestPart } from "@/pages/parts/admin/WorkerTestPart"; @@ -19,6 +20,7 @@ export function AdminPage() { + diff --git a/src/pages/parts/admin/ExtensionOverridePart.tsx b/src/pages/parts/admin/ExtensionOverridePart.tsx new file mode 100644 index 00000000..6fa5cbf4 --- /dev/null +++ b/src/pages/parts/admin/ExtensionOverridePart.tsx @@ -0,0 +1,67 @@ +import { t } from "i18next"; +import { useEffect, useState } from "react"; + +import { Button } from "@/components/buttons/Button"; +import { Icon, Icons } from "@/components/Icon"; +import { Box } from "@/components/layout/Box"; +import { Heading2 } from "@/components/utils/Text"; + +const EXTENSION_OVERRIDE_KEY = "___dev_extension_override"; + +export function ExtensionOverridePart() { + const [isOverrideEnabled, setIsOverrideEnabled] = useState(false); + + useEffect(() => { + const stored = localStorage.getItem(EXTENSION_OVERRIDE_KEY); + setIsOverrideEnabled(stored === "true"); + }, []); + + const toggleOverride = () => { + const newState = !isOverrideEnabled; + setIsOverrideEnabled(newState); + + if (newState) { + localStorage.setItem(EXTENSION_OVERRIDE_KEY, "true"); + } else { + localStorage.removeItem(EXTENSION_OVERRIDE_KEY); + } + + // Refresh the page to apply the change + window.location.reload(); + }; + + return ( + <> + + {t("settings.account.admin.extensionOverride.title")} + + +
+
+

+ {t("settings.account.admin.extensionOverride.text")} +

+ {isOverrideEnabled && ( +

+ + {t("settings.account.admin.extensionOverride.enabled")} +

+ )} +
+ +
+
+ + ); +} diff --git a/src/utils/extension.ts b/src/utils/extension.ts index 8874146b..c6420eb4 100644 --- a/src/utils/extension.ts +++ b/src/utils/extension.ts @@ -9,7 +9,15 @@ export type ExtensionStatus = | "outdated" | "success"; +const EXTENSION_OVERRIDE_KEY = "___dev_extension_override"; + +function isExtensionOverrideEnabled(): boolean { + if (typeof window === "undefined") return false; + return localStorage.getItem(EXTENSION_OVERRIDE_KEY) === "true"; +} + export async function getExtensionState(): Promise { + if (isExtensionOverrideEnabled()) return "success"; const info = await extensionInfo(); if (!info) return "unknown"; // cant talk to extension if (!info.success) return "failed"; // extension failed to respond