import classNames from "classnames"; import { ReactNode } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useAsync } from "react-use"; import { isExtensionActive } from "@/backend/extension/messaging"; import { singularProxiedFetch } from "@/backend/helpers/fetch"; import { Button } from "@/components/buttons/Button"; import { Icon, Icons } from "@/components/Icon"; import { Loading } from "@/components/layout/Loading"; import { SettingsCard } from "@/components/layout/SettingsCard"; import { StatusCircle, StatusCircleProps, } from "@/components/player/internals/StatusCircle"; import { Heading3 } from "@/components/utils/Text"; import { useAuthStore } from "@/stores/auth"; const testUrl = "https://postman-echo.com/get"; type Status = "success" | "unset" | "error"; type SetupData = { extension: Status; proxy: Status; defaultProxy: Status; }; function testProxy(url: string) { return new Promise((resolve, reject) => { setTimeout(() => reject(new Error("Timed out!")), 3000); singularProxiedFetch(url, testUrl, {}) .then((res) => { if (res.url !== testUrl) return reject(new Error("Not a proxy")); resolve(); }) .catch(reject); }); } function useIsSetup() { const proxyUrls = useAuthStore((s) => s.proxySet); const { loading, value } = useAsync(async (): Promise => { const extensionStatus: Status = (await isExtensionActive()) ? "success" : "unset"; let proxyStatus: Status = "unset"; if (proxyUrls && proxyUrls.length > 0) { try { await testProxy(proxyUrls[0]); proxyStatus = "success"; } catch { proxyStatus = "error"; } } return { extension: extensionStatus, proxy: proxyStatus, defaultProxy: "success", }; }, [proxyUrls]); let globalState: Status = "unset"; if (value?.extension === "success" || value?.proxy === "success") globalState = "success"; if (value?.proxy === "error" || value?.extension === "error") globalState = "error"; return { setupStates: value, globalState, loading, }; } function SetupCheckList(props: { status: Status; grey?: boolean; highlight?: boolean; children?: ReactNode; }) { const { t } = useTranslation(); const statusMap: Record = { error: "error", success: "success", unset: "noresult", }; return (

{props.children}

{props.status === "error" ? (

{t("settings.connections.setup.itemError")}

) : null}
); } export function SetupPart() { const { t } = useTranslation(); const navigate = useNavigate(); const { loading, setupStates, globalState } = useIsSetup(); if (loading || !setupStates) { return (
); } const textLookupMap: Record< Status, { title: string; desc: string; button: string } > = { error: { title: "settings.connections.setup.errorStatus.title", desc: "settings.connections.setup.errorStatus.description", button: "settings.connections.setup.redoSetup", }, success: { title: "settings.connections.setup.successStatus.title", desc: "settings.connections.setup.successStatus.description", button: "settings.connections.setup.redoSetup", }, unset: { title: "settings.connections.setup.unsetStatus.title", desc: "settings.connections.setup.unsetStatus.description", button: "settings.connections.setup.doSetup", }, }; return (
{t(textLookupMap[globalState].title)}

{t(textLookupMap[globalState].desc)}

{t("settings.connections.setup.items.extension")} {t("settings.connections.setup.items.proxy")} {t("settings.connections.setup.items.default")}
); }