import { ReactNode, useCallback, useEffect, useMemo, useState } from "react"; import { Trans, useTranslation } from "react-i18next"; import { useAsyncFn, useInterval } from "react-use"; import { sendPage } from "@/backend/extension/messaging"; import { Button } from "@/components/buttons/Button"; import { Icon, Icons } from "@/components/Icon"; import { Loading } from "@/components/layout/Loading"; import { Stepper } from "@/components/layout/Stepper"; import { CenterContainer } from "@/components/layout/ThinContainer"; import { Heading2, Paragraph } from "@/components/utils/Text"; import { MinimalPageLayout } from "@/pages/layouts/MinimalPageLayout"; import { useNavigateOnboarding, useRedirectBack, } from "@/pages/onboarding/onboardingHooks"; import { Card, Link } from "@/pages/onboarding/utils"; import { PageTitle } from "@/pages/parts/util/PageTitle"; import { conf } from "@/setup/config"; import { ExtensionDetectionResult, detectExtensionInstall, } from "@/utils/detectFeatures"; import { getExtensionState } from "@/utils/extension"; import type { ExtensionStatus } from "@/utils/extension"; function RefreshBar() { const { t } = useTranslation(); const reload = useCallback(() => { window.location.reload(); }, []); return (

{t("onboarding.extension.notDetecting")}

); } export function ExtensionStatus(props: { status: ExtensionStatus; loading: boolean; showHelp?: boolean; }) { const { t } = useTranslation(); const [lastKnownStatus, setLastKnownStatus] = useState(props.status); useEffect(() => { if (!props.loading) setLastKnownStatus(props.status); }, [props.status, props.loading]); let content: ReactNode = null; if (props.loading || props.status === "unknown") content = ( <>

{t("onboarding.extension.status.loading")}

); if (props.status === "disallowed" || props.status === "noperms") content = ( <>

{t("onboarding.extension.status.disallowed")}

); else if (props.status === "failed") content =

{t("onboarding.extension.status.failed")}

; else if (props.status === "outdated") content =

{t("onboarding.extension.status.outdated")}

; else if (props.status === "success") content = (

{t("onboarding.extension.status.success")}

); return ( <>
{content}
{lastKnownStatus === "unknown" ? : null} {props.showHelp && props.status !== "success" ? (

, }} />

) : null} ); } interface ExtensionPageProps { status: ExtensionStatus; loading: boolean; } function ChromeExtensionPage(props: ExtensionPageProps) { const { t } = useTranslation(); const installLink = conf().ONBOARDING_CHROME_EXTENSION_INSTALL_LINK; return ( <> {t("onboarding.extension.title")} {t("onboarding.extension.explainer")} {installLink ? ( {t("onboarding.extension.linkChrome")} ) : null} ); } function FirefoxExtensionPage(props: ExtensionPageProps) { const { t } = useTranslation(); const installLink = conf().ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK; return ( <> {t("onboarding.extension.title")} {t("onboarding.extension.explainer")} {installLink ? ( {t("onboarding.extension.linkFirefox")} ) : null} ); } function IosExtensionPage(_props: ExtensionPageProps) { const { t } = useTranslation(); return ( <> {t("onboarding.extension.title")} }} /> ); } function UnknownExtensionPage(props: ExtensionPageProps) { const { t } = useTranslation(); const installChromeLink = conf().ONBOARDING_CHROME_EXTENSION_INSTALL_LINK; const installFirefoxLink = conf().ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK; return ( <> {t("onboarding.extension.title")} {t("onboarding.extension.explainer")}
{installChromeLink ? ( {t("onboarding.extension.linkChrome")} ) : null}
{installFirefoxLink ? ( {t("onboarding.extension.linkFirefox")} ) : null}
); } export function OnboardingExtensionPage() { const { t } = useTranslation(); const navigate = useNavigateOnboarding(); const { completeAndRedirect } = useRedirectBack(); const extensionSupport = useMemo(() => detectExtensionInstall(), []); const [{ loading, value }, exec] = useAsyncFn( async (triggeredManually: boolean = false) => { const status = await getExtensionState(); if (status === "success" && triggeredManually) completeAndRedirect(); return status; }, [completeAndRedirect], ); useInterval(exec, 1000); const componentMap: Record< ExtensionDetectionResult, typeof UnknownExtensionPage > = { chrome: ChromeExtensionPage, firefox: FirefoxExtensionPage, ios: IosExtensionPage, unknown: UnknownExtensionPage, }; const PageContent = componentMap[extensionSupport]; return (
{value === "success" ? ( ) : null}
); }