haixunMaster/components/accounts/delete-account-card.tsx

74 lines
2.4 KiB
TypeScript

"use client";
import { useState } from "react";
import { Loader2, Trash2 } from "lucide-react";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { ConfirmDialog } from "@/components/ui/confirm-dialog";
import { notify } from "@/lib/notifications/store";
interface DeleteAccountCardProps {
accountId: string;
accountName: string;
onDeleted?: () => void;
}
export function DeleteAccountCard({ accountId, accountName, onDeleted }: DeleteAccountCardProps) {
const [deleting, setDeleting] = useState(false);
const [confirmOpen, setConfirmOpen] = useState(false);
async function handleDelete() {
setDeleting(true);
try {
const res = await fetch(`/api/accounts/${accountId}`, { method: "DELETE" });
const text = await res.text();
const data = text.trim() ? (JSON.parse(text) as { error?: string; activeAccountId?: string | null }) : {};
if (!res.ok) {
throw new Error(data.error ?? "刪除失敗");
}
notify({ type: "success", title: "已刪除帳號" });
if (data.activeAccountId) {
onDeleted?.();
return;
}
window.location.reload();
} catch (error) {
notify({
type: "error",
title: "刪除失敗",
message: error instanceof Error ? error.message : "未知錯誤",
});
} finally {
setDeleting(false);
}
}
return (
<Card className="border-destructive/30">
<CardHeader>
<CardTitle className="text-destructive"></CardTitle>
<CardDescription>
{accountName}稿 AI Key
</CardDescription>
</CardHeader>
<CardContent>
<Button variant="destructive" onClick={() => setConfirmOpen(true)} disabled={deleting}>
{deleting ? <Loader2 className="h-4 w-4 animate-spin" /> : <Trash2 className="h-4 w-4" />}
</Button>
<ConfirmDialog
open={confirmOpen}
onOpenChange={setConfirmOpen}
title="刪除帳號"
description={`確定要刪除「${accountName}」?會一併刪除這個帳號的主題、海巡紀錄、草稿與發文資料,且無法復原。`}
confirmText="永久刪除"
danger
onConfirm={handleDelete}
/>
</CardContent>
</Card>
);
}