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