import { data, useSearchParams } from "react-router"; import { useTranslation } from "react-i18next"; import type { Route } from "./+types/settings.connections"; import { loadConnectionsSettings } from "./settings.connections.server"; const KNOWN_ERRORS = ["too_many_tokens", "sync_failed", "generic"] as const; type KnownError = (typeof KNOWN_ERRORS)[number]; function isKnownError(value: string | null): value is KnownError { return value !== null && (KNOWN_ERRORS as readonly string[]).includes(value); } export function meta() { return [{ title: "Connected services — Settings — trails.cool" }]; } export async function loader({ request }: Route.LoaderArgs) { return data(await loadConnectionsSettings(request)); } export default function ConnectionsSettings({ loaderData }: Route.ComponentProps) { const { providers } = loaderData; const { t } = useTranslation(["journal"]); const [searchParams] = useSearchParams(); const errorParam = searchParams.get("error"); const errorKey: KnownError | null = isKnownError(errorParam) ? errorParam : errorParam ? "generic" : null; return (

{t("settings.services.title")}

{errorKey && (
{t(`settings.services.errors.${errorKey}`)}
)}
{providers.map((p) => (

{p.name}

{p.connected && p.providerUserId && (

{t("settings.services.connectedAs", { id: p.providerUserId })}

)}
{p.connected ? (
{t("sync.import")}
) : ( {t("settings.services.connect")} )}
))}
); }