import { useEffect, useState } from "react"; import { Link, useLocation, useNavigate } from "react-router-dom"; import { useTranslation, Trans } from "react-i18next"; import { TooltipContent, TooltipProvider } from "@radix-ui/react-tooltip"; import { Earth } from "lucide-react"; import Show from "@/components/Show"; import DeployProgress from "@/components/certimate/DeployProgress"; import DeployState from "@/components/certimate/DeployState"; import XPagination from "@/components/certimate/XPagination"; import { AlertDialogAction, AlertDialogCancel, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialog, AlertDialogContent, AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog"; import { Button } from "@/components/ui/button"; import { Separator } from "@/components/ui/separator"; import { Switch } from "@/components/ui/switch"; import { Toaster } from "@/components/ui/toaster"; import { Tooltip, TooltipTrigger } from "@/components/ui/tooltip"; import { useToast } from "@/components/ui/use-toast"; import { CustomFile, saveFiles2ZIP } from "@/lib/file"; import { convertZulu2Beijing, getDate, getLeftDays } from "@/lib/time"; import { Domain } from "@/domain/domain"; import { list, remove, save, subscribeId, unsubscribeId } from "@/repository/domains"; const Home = () => { const toast = useToast(); const navigate = useNavigate(); const { t } = useTranslation(); const location = useLocation(); const query = new URLSearchParams(location.search); const page = query.get("page"); const state = query.get("state"); const [totalPage, setTotalPage] = useState(0); const handleCreateClick = () => { navigate("/edit"); }; const setPage = (newPage: number) => { query.set("page", newPage.toString()); navigate(`?${query.toString()}`); }; const handleEditClick = (id: string) => { navigate(`/edit?id=${id}`); }; const handleHistoryClick = (id: string) => { navigate(`/history?domain=${id}`); }; const handleDeleteClick = async (id: string) => { try { await remove(id); setDomains(domains.filter((domain) => domain.id !== id)); } catch (error) { console.error("Error deleting domain:", error); } }; const [domains, setDomains] = useState([]); useEffect(() => { const fetchData = async () => { const data = await list({ page: page ? Number(page) : 1, perPage: 10, state: state ? state : "", }); setDomains(data.items); setTotalPage(data.totalPages); }; fetchData(); }, [page, state]); const handelCheckedChange = async (id: string) => { const checkedDomains = domains.filter((domain) => domain.id === id); const isChecked = checkedDomains[0].enabled; const data = checkedDomains[0]; data.enabled = !isChecked; await save(data); const updatedDomains = domains.map((domain) => { if (domain.id === id) { return { ...domain, checked: !isChecked }; } return domain; }); setDomains(updatedDomains); }; const handleRightNowClick = async (domain: Domain) => { try { unsubscribeId(domain.id ?? ""); subscribeId(domain.id ?? "", (resp) => { const updatedDomains = domains.map((domain) => { if (domain.id === resp.id) { return { ...resp }; } return domain; }); setDomains(updatedDomains); }); domain.rightnow = true; await save(domain); toast.toast({ title: t("domain.deploy.started.message"), description: t("domain.deploy.started.tips"), }); } catch (e) { toast.toast({ title: t("domain.deploy.failed.message"), description: ( // 这里的 text 只是占位作用,实际文案在 src/i18n/locales/[lang].json text1 text2 text3 ), variant: "destructive", }); } }; const handleForceClick = async (domain: Domain) => { await handleRightNowClick({ ...domain, deployed: false }); }; const handleDownloadClick = async (domain: Domain) => { const zipName = `${domain.id}-${domain.domain}.zip`; const files: CustomFile[] = [ { name: `${domain.domain}.pem`, content: domain.certificate ? domain.certificate : "", }, { name: `${domain.domain}.key`, content: domain.privateKey ? domain.privateKey : "", }, ]; await saveFiles2ZIP(zipName, files); }; return ( <>
{t("domain.page.title")}
{!domains.length ? ( <>
{t("domain.nodata")}
) : ( <>
{t("common.text.domain")}
{t("domain.props.expiry")}
{t("domain.props.last_execution_status")}
{t("domain.props.last_execution_stage")}
{t("domain.props.last_execution_time")}
{t("domain.props.enable")}
{t("common.text.operations")}
{domains.map((domain) => (
{domain.domain.split(";").map((item) => ( <> {item}
))}
{domain.expiredAt ? ( <>
{t("domain.props.expiry.date1", { date: `${getLeftDays(domain.expiredAt)}/90` })}
{t("domain.props.expiry.date2", { date: getDate(domain.expiredAt), })}
) : ( "---" )}
{domain.lastDeployedAt && domain.expand?.lastDeployment ? ( <> ) : ( "---" )}
{domain.lastDeployedAt && domain.expand?.lastDeployment ? ( ) : ( "---" )}
{domain.lastDeployedAt ? convertZulu2Beijing(domain.lastDeployedAt) : "---"}
{ handelCheckedChange(domain.id ?? ""); }} >
{domain.enabled ? t("domain.props.enable.disabled") : t("domain.props.enable.enabled")}
{!domain.enabled && ( <> {t("domain.delete")} {t("domain.delete.confirm")} {t("common.cancel")} { handleDeleteClick(domain.id ?? ""); }} > {t("common.confirm")} )}
))} { setPage(page); }} /> )}
); }; export default Home;