// Copyright (c) 2020-2021 Drew Lemmy // This file is part of KristWeb 2 under GPL-3.0. // Full details: https://github.com/tmpim/KristWeb2/blob/master/LICENSE.txt import classNames from "classnames"; import { Card, Skeleton, Tag } from "antd"; import { useTranslation } from "react-i18next"; import { WhatsNewItem } from "./types"; import Markdown from "markdown-to-jsx"; import { useMarkdownLink } from "@comp/krist/MarkdownLink"; import { DateTime } from "@comp/DateTime"; import { slice } from "lodash-es"; interface Props { loading?: boolean; whatsNew?: WhatsNewItem[]; baseURL?: string; repoURL: string; className?: string; } export function WhatsNewCard({ loading, whatsNew, baseURL, repoURL, className }: Props): JSX.Element { const { t } = useTranslation(); const classes = classNames("kw-card", "whats-new-card-whats-new", className); return <Card title={t("whatsNew.cardWhatsNewTitle")} className={classes}> <Skeleton paragraph={{ rows: 4 }} title={false} active loading={loading}> {!loading && whatsNew && <> {/* Display the first 5 whats new items */} {slice(whatsNew, 0, 5).map((w, i) => ( // I'm hesitant to use an index here, but there's nothing better <WhatsNew key={i} whatsNew={w} baseURL={baseURL} repoURL={repoURL} /> ))} </>} </Skeleton> </Card>; } interface WhatsNewProps { whatsNew: WhatsNewItem; baseURL?: string; repoURL: string; } function WhatsNew({ whatsNew, baseURL, repoURL }: WhatsNewProps): JSX.Element { const { t } = useTranslation(); const MarkdownLink = useMarkdownLink(baseURL); return <div className="card-list-item whats-new-item"> <div className="whats-new-body"> {/* "New!" tag */} {whatsNew.new && ( <Tag className="whats-new-new-tag">{t("whatsNew.new")}</Tag> )} {/* What's new item body */} <Markdown options={{ disableParsingRawHTML: true, overrides: { a: MarkdownLink } }}> {whatsNew.body} </Markdown> </div> <div className="whats-new-footer"> {/* Author avatar */} {whatsNew.authorUsername && ( <img className="whats-new-avatar" src={`https://github.com/${whatsNew.authorUsername}.png?size=16`} /> )} {/* Author name */} {whatsNew.authorName && <> <span className="author-name">{whatsNew.authorName}</span> <span className="sep">–</span> </>} {/* Date and link to commits */} <a href={repoURL + "/commit/" + whatsNew.commitHash} target="_blank" rel="noopener noreferrer" > <DateTime className="whats-new-date" date={whatsNew.date} /> </a> </div> </div>; }