import { Link, useLocation, useMatches } from "@remix-run/react"; import * as React from "react"; import type { RootLoaderData } from "~/root"; import type { Breadcrumb, SendouRouteHandle } from "~/utils/remix"; import { Footer } from "./Footer"; import { useTranslation } from "~/hooks/useTranslation"; import { Image } from "../Image"; import { SideNav } from "./SideNav"; import { UserItem } from "./UserItem"; import { LanguageChanger } from "./LanguageChanger"; import { ThemeChanger } from "./ThemeChanger"; import { LinkButton } from "../Button"; import { SUPPORT_PAGE } from "~/utils/urls"; import { HeartIcon } from "../icons/Heart"; import { useIsMounted } from "~/hooks/useIsMounted"; function useBreadcrumbs() { const { t } = useTranslation(); const matches = useMatches(); return React.useMemo(() => { const result: Array> = []; for (const match of [...matches].reverse()) { const handle = match.handle as SendouRouteHandle | undefined; const resolvedBreadcrumb = handle?.breadcrumb?.({ match, t }); if (resolvedBreadcrumb) { result.push(resolvedBreadcrumb); } } return result.flat(); }, [matches, t]); } export const Layout = React.memo(function Layout({ children, data, isErrored = false, }: { children: React.ReactNode; data?: RootLoaderData; isErrored?: boolean; }) { const { t } = useTranslation(["common"]); const location = useLocation(); const breadcrumbs = useBreadcrumbs(); const isFrontPage = location.pathname === "/"; const showLeaderboard = data && data.publisherId && !data?.user?.patronTier && !location.pathname.includes("plans"); return (
sendou.ink {breadcrumbs.flatMap((breadcrumb) => { return [ / , , ]; })} {isFrontPage ? ( <>
-
{t("common:websiteSubtitle")}
{data && typeof data?.user?.patronTier !== "number" ? ( } variant="outlined" className="ml-auto desktop-hidden" > {t("common:pages.support")} ) : null} ) : null}
{data && typeof data?.user?.patronTier !== "number" ? ( } variant="outlined" > {t("common:pages.support")} ) : null} {!isErrored ? : null}
{!isFrontPage ? : null} {showLeaderboard ? : null} {children}
); }); function BreadcrumbLink({ data }: { data: Breadcrumb }) { if (data.type === "IMAGE") { return ( ); } return ( {data.text} ); } const RampUnit = React.lazy(() => import("../ramp/RampUnit")); function MyRampUnit() { const isMounted = useIsMounted(); if (!isMounted) { return
; } return ; }