sitegen/framework/meta/nextjs/generate/icons.tsx

63 lines
1.6 KiB
TypeScript
Raw Normal View History

import type { ResolvedMetadata } from "../types/metadata-interface";
import type { Icon, IconDescriptor } from "../types/metadata-types";
import React from "react";
function IconDescriptorLink({ icon }: { icon: IconDescriptor }) {
const { url, rel = "icon", ...props } = icon;
return <link rel={rel} href={url.toString()} {...props} />;
}
function IconLink({ rel, icon }: { rel?: string; icon: Icon }) {
if (typeof icon === "object" && !(icon instanceof URL)) {
if (rel) icon.rel = rel;
return <IconDescriptorLink icon={icon} />;
} else {
const href = icon.toString();
return <link rel={rel} href={href} />;
}
}
export function IconsMetadata({ icons }: { icons: ResolvedMetadata["icons"] }) {
if (!icons) return null;
const shortcutList = icons.shortcut;
const iconList = icons.icon;
const appleList = icons.apple;
const otherList = icons.other;
return (
<>
{shortcutList
? shortcutList.map((icon, index) => (
<IconLink
key={`shortcut-${index}`}
rel="shortcut icon"
icon={icon}
/>
))
: null}
{iconList
? iconList.map((icon, index) => (
<IconLink key={`shortcut-${index}`} rel="icon" icon={icon} />
))
: null}
{appleList
? appleList.map((icon, index) => (
<IconLink
key={`apple-${index}`}
rel="apple-touch-icon"
icon={icon}
/>
))
: null}
{otherList
? otherList.map((icon, index) => (
<IconDescriptorLink key={`other-${index}`} icon={icon} />
))
: null}
</>
);
}