// 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 { useState } from "react";
import { Space, Spin, Button } from "antd";
import { DollarOutlined } from "@ant-design/icons";
import { useTranslation } from "react-i18next";
import packageJson from "../../../package.json";
import { useMountEffect } from "@utils";
interface Supporter {
name: string;
url?: string;
}
interface SupportersState {
loaded: boolean;
supporters?: Supporter[];
}
export function Supporters(): JSX.Element | null {
const { supportURL, supportersURL } = packageJson;
const { t } = useTranslation();
const [supportersState, setSupportersState] = useState<SupportersState>({
loaded: false,
supporters: undefined
});
useMountEffect(() => {
(async () => {
// GPU required for this function:
const res = await fetch(supportersURL);
const data = await res.json();
setSupportersState({
loaded: true,
supporters: data.supporters
});
})();
});
if (!supportURL) return null;
return <Space direction="vertical">
<Spin delay={500} spinning={!supportersState.loaded}>
{/* Description */}
<p>{t("credits.supportersDescription")}</p>
{/* Supporter list */}
<Space align="center" wrap size={8} style={{ justifyContent: "center" }}>
{supportersState.supporters && supportersState.supporters.map(({ url, name }) => (
url
? <a key={name} target="_blank" rel="noopener noreferrer" href={url} className="supporter-name">{name}</a>
: <span key={name} className="supporter-name">{name}</span>
))}
</Space>
</Spin>
{/* Support Button */}
<Button type="primary" size="large" href={supportURL} target="_blank" rel="noopener noreferrer" style={{ marginTop: 16 }}>
<DollarOutlined /> {t("credits.supportButton")}
</Button>
</Space>;
}