sitegen/framework/meta/nextjs/generate/alternate.tsx
chloe caruso af60d1172f i accidentally deleted the repo, but recovered it. i'll start committing
it was weird. i pressed delete on a subfolder, i think one of the
pages.off folders that i was using. and then, suddenly, nvim on windows
7 decided to delete every file in the directory. they weren't shred off
the space time continuum, but just marked deleted. i had to pay $80 to
get access to a software that could see them. bleh!

just seeing all my work, a little over a week, was pretty heart
shattering. but i remembered that long ago, a close friend said i could
call them whenever i was feeling sad. i finally took them up on that
offer. the first time i've ever called someone for emotional support.
but it's ok. i got it back. and the site framework is better than ever.

i'm gonna commit and push more often. the repo is private anyways.
2025-06-06 23:38:02 -07:00

72 lines
1.8 KiB
TypeScript

import type { ResolvedMetadata } from "../types/metadata-interface";
import React from "react";
import { AlternateLinkDescriptor } from "../types/alternative-urls-types";
function AlternateLink({
descriptor,
...props
}: {
descriptor: AlternateLinkDescriptor;
} & React.LinkHTMLAttributes<HTMLLinkElement>) {
if (!descriptor.url) return null;
return (
<link
{...props}
{...(descriptor.title && { title: descriptor.title })}
href={descriptor.url.toString()}
/>
);
}
export function AlternatesMetadata({
alternates,
}: {
alternates: ResolvedMetadata["alternates"];
}) {
if (!alternates) return null;
const { canonical, languages, media, types } = alternates;
return (
<>
{canonical
? <AlternateLink rel="canonical" descriptor={canonical} />
: null}
{languages
? Object.entries(languages).map(([locale, descriptors]) => {
return descriptors?.map((descriptor, index) => (
<AlternateLink
rel="alternate"
key={index}
hrefLang={locale}
descriptor={descriptor}
/>
));
})
: null}
{media
? Object.entries(media).map(([mediaName, descriptors]) =>
descriptors?.map((descriptor, index) => (
<AlternateLink
rel="alternate"
key={index}
media={mediaName}
descriptor={descriptor}
/>
))
)
: null}
{types
? Object.entries(types).map(([type, descriptors]) =>
descriptors?.map((descriptor, index) => (
<AlternateLink
rel="alternate"
key={index}
type={type}
descriptor={descriptor}
/>
))
)
: null}
</>
);
}