import * as React from "react"; import clsx from "clsx"; import { useRouter } from "next/router"; import NextLink, { LinkProps as NextLinkProps } from "next/link"; import MuiLink, { LinkProps as MuiLinkProps } from "@mui/material/Link"; import { styled } from "@mui/material/styles"; import i18n, { getLanguages } from "./i18n"; // Add support for the sx prop for consistency with the other branches. const Anchor = styled("a")({}); interface NextLinkComposedProps extends Omit, "href">, Omit { to: NextLinkProps["href"]; linkAs?: NextLinkProps["as"]; href?: NextLinkProps["href"]; } export const NextLinkComposed = React.forwardRef< HTMLAnchorElement, NextLinkComposedProps >(function NextLinkComposed(props, ref) { const { to, linkAs, href, replace, scroll, shallow, prefetch, locale, ...other } = props; return ( ); }); export type StyledLinkProps = { activeClassName?: string; as?: NextLinkProps["as"]; href: NextLinkProps["href"]; linkAs?: NextLinkProps["as"]; // Useful when the as prop is shallow by styled(). noLinkStyle?: boolean; } & Omit & Omit; // A styled version of the Next.js Link component: // https://nextjs.org/docs/api-reference/next/link const StyledLink = React.forwardRef( function Link(props, ref) { const { activeClassName = "active", as: linkAs, className: classNameProps, href, noLinkStyle, role, // Link don't have roles. ...other } = props; const router = useRouter(); const pathname = typeof href === "string" ? href : href.pathname; const className = clsx(classNameProps, { [activeClassName]: router.pathname === pathname && activeClassName, }); const isExternal = typeof href === "string" && (href.indexOf("http") === 0 || href.indexOf("mailto:") === 0); if (isExternal) { if (noLinkStyle) { return ( ); } return ; } if (noLinkStyle) { return ( ); } return ( ); }, ); function pathnameWithoutLang(pathname: string | null | undefined) { if (!pathname || !pathname.startsWith("/")) { return pathname; } const parts = pathname.split("/"); // if path doesn't have lang if (parts.length > 2 && !getLanguages().includes(parts[1])) { return parts.join("/"); } // remove lang return parts.length > 2 ? parts.slice(2).join("/") : "/"; } export type LinkProps = { lang?: string; } & StyledLinkProps; // A styled version of the Next.js Link component: // https://nextjs.org/docs/api-reference/next/link const Link = React.forwardRef(function Link( props, ref, ) { const { href, lang, as, ...other } = props; // const router = useRouter(); let pathname = typeof href === "string" ? href : href.pathname; if (as) pathname = as.toString(); const isExternal = typeof href === "string" && (href.indexOf("http") === 0 || href.indexOf("mailto:") === 0); const localeHref: string = !isExternal ? lang ? `/${lang}/${pathnameWithoutLang(pathname)}` : `/${i18n.language}${pathname}` : href; // console.log(localeHref); return ; }); export default Link;