63 lines
1.6 KiB
TypeScript
63 lines
1.6 KiB
TypeScript
|
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}
|
||
|
</>
|
||
|
);
|
||
|
}
|