PrzZiomek2 778beddb5e migrate notice-board component
Summary:
migrate notice-board component

Ref T2920

Reviewers: #testers, kuba-orlik

Reviewed By: #testers, kuba-orlik

Subscribers: kuba-orlik, jenkins-user

Maniphest Tasks: T2920

Differential Revision: https://hub.sealcode.org/D1601
2025-08-21 17:30:12 +02:00

105 lines
2.6 KiB
TypeScript

import { TempstreamJSX } from "tempstream";
import type { ComponentToHTMLArgs } from "@sealcode/jdd";
import { Component, ComponentArguments } from "@sealcode/jdd";
import TelegramIcon from "./icons/telegram.svg";
import EmailIcon from "./icons/email.svg";
import ForumIcon from "./icons/forum.svg";
import IRCIcon from "./icons/irc.svg";
const component_arguments = {
title: new ComponentArguments.ShortText(),
image: new ComponentArguments.Image(),
leftheader: new ComponentArguments.ShortText(),
rightheader: new ComponentArguments.ShortText(),
links: new ComponentArguments.List(
new ComponentArguments.Structured({
href: new ComponentArguments.ShortText(),
name: new ComponentArguments.ShortText(),
icon: new ComponentArguments.Enum(["Telegram", "Forum", "Email", "IRC"]),
title: new ComponentArguments.ShortText(),
})
),
} as const;
const iconNameToIcon: Record<string, string | undefined> = {
Telegram: TelegramIcon.url,
Email: EmailIcon.url,
Forum: ForumIcon.url,
IRC: IRCIcon.url,
};
const renderContact = ({
href,
name,
icon,
title,
}: {
href: string;
name: string;
icon: string;
title: string;
}) => {
const icon_url = iconNameToIcon[icon];
if (!icon_url) {
return " ";
}
return (
<div class="notice-board__contact">
<a
class="notice-board__contact-icon"
href={href}
{...(title ? { title } : {})}
>
<img src={icon_url} alt={name} width="55" height="55" />
<span>{name}</span>
</a>
</div>
);
};
export class NoticeBoard extends Component<typeof component_arguments> {
getArguments() {
return component_arguments;
}
async toHTML({
args: { title, image, links, rightheader, leftheader },
classes,
jdd_context: { render_markdown, render_image, language },
}: ComponentToHTMLArgs<typeof component_arguments>): Promise<string> {
return (
<section class={["nb-root", ...classes]}>
<div class="notice-board">
{title && (
<div
class="notice-board__anchor-point"
id={render_markdown(language, title)}
></div>
)}
<div class="notice-board__background">
{render_image(image, {
resolutions: [800, 1000, 1200, 1500, 2000],
sizesAttr: "100vw",
alt: "",
})}
</div>
<div class="notice-board__body">
<div class="notice-board__body-inner">
<h2 class="notice-board__header-main">
{render_markdown(language, leftheader)}
</h2>
<h3 class="notice-board__header-minor">
{render_markdown(language, rightheader)}
</h3>
<address class="notice-board__contacts">
{links.map(renderContact)}
</address>
</div>
</div>
</div>
</section>
);
}
}