Supports certificate downloads, wildcard domains, and more.
This commit is contained in:
@@ -62,7 +62,7 @@ const Edit = () => {
|
||||
|
||||
const formSchema = z.object({
|
||||
id: z.string().optional(),
|
||||
domain: z.string().regex(/^(?!:\/\/)([a-zA-Z0-9-_]+\.)+[a-zA-Z]{2,}$/, {
|
||||
domain: z.string().regex(/^(?:\*\.)?([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/, {
|
||||
message: "请输入正确的域名",
|
||||
}),
|
||||
access: z.string().regex(/^[a-zA-Z0-9]+$/, {
|
||||
|
||||
@@ -19,6 +19,7 @@ import { Toaster } from "@/components/ui/toaster";
|
||||
import { Tooltip, TooltipTrigger } from "@/components/ui/tooltip";
|
||||
import { useToast } from "@/components/ui/use-toast";
|
||||
import { Domain } from "@/domain/domain";
|
||||
import { CustomFile, saveFiles2ZIP } from "@/lib/file";
|
||||
import { convertZulu2Beijing, getDate } from "@/lib/time";
|
||||
import {
|
||||
list,
|
||||
@@ -127,6 +128,22 @@ const Home = () => {
|
||||
}
|
||||
};
|
||||
|
||||
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 (
|
||||
<>
|
||||
<div className="">
|
||||
@@ -253,6 +270,17 @@ const Home = () => {
|
||||
</Button>
|
||||
</Show>
|
||||
|
||||
<Show when={domain.expiredAt ? true : false}>
|
||||
<Separator orientation="vertical" className="h-4 mx-2" />
|
||||
<Button
|
||||
variant={"link"}
|
||||
className="p-0"
|
||||
onClick={() => handleDownloadClick(domain)}
|
||||
>
|
||||
下载
|
||||
</Button>
|
||||
</Show>
|
||||
|
||||
{!domain.enabled && (
|
||||
<>
|
||||
<Separator orientation="vertical" className="h-4 mx-2" />
|
||||
|
||||
Reference in New Issue
Block a user