diff --git a/web/src/components/ConfirmDialog.tsx b/web/src/components/ConfirmDialog.tsx deleted file mode 100644 index 2691ec00f..000000000 --- a/web/src/components/ConfirmDialog.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import DOMPurify from "dompurify"; -import { marked } from "marked"; -import * as React from "react"; -import { Button } from "@/components/ui/button"; -import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; - -export interface ConfirmDialogProps { - open: boolean; - onOpenChange: (open: boolean) => void; - title: React.ReactNode; - description?: React.ReactNode; - descriptionMarkdown?: string; - confirmLabel: string; - cancelLabel: string; - onConfirm: () => void | Promise; - confirmVariant?: "default" | "destructive"; -} - -export default function ConfirmDialog({ - open, - onOpenChange, - title, - description, - descriptionMarkdown, - confirmLabel, - cancelLabel, - onConfirm, - confirmVariant = "default", -}: ConfirmDialogProps) { - const [loading, setLoading] = React.useState(false); - - const handleConfirm = async () => { - try { - setLoading(true); - await onConfirm(); - onOpenChange(false); - } catch (e) { - console.error(e); - } finally { - setLoading(false); - } - }; - - // prepare sanitized HTML if Markdown was provided - const descriptionHtml = typeof descriptionMarkdown === "string" ? DOMPurify.sanitize(String(marked.parse(descriptionMarkdown))) : null; - - return ( - !loading && onOpenChange(o)}> - - - {title} - {descriptionHtml ? ( - - ) : description ? ( - {description} - ) : null} - - - - - - - - ); -} diff --git a/web/src/components/ConfirmDialog/index.tsx b/web/src/components/ConfirmDialog/index.tsx index 340c6ead2..f1b594b3d 100644 --- a/web/src/components/ConfirmDialog/index.tsx +++ b/web/src/components/ConfirmDialog/index.tsx @@ -3,7 +3,6 @@ import { marked } from "marked"; import * as React from "react"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; -import styles from "./ConfirmDialog.module.scss"; export interface ConfirmDialogProps { /** Whether the dialog is open */ @@ -67,7 +66,7 @@ export default function ConfirmDialog({ return ( !loading && onOpenChange(o)}> - + {title} {/* @@ -85,7 +84,7 @@ export default function ConfirmDialog({ - diff --git a/web/src/components/Settings/MemberSection.tsx b/web/src/components/Settings/MemberSection.tsx index 2d4cc7b62..eb1b8c780 100644 --- a/web/src/components/Settings/MemberSection.tsx +++ b/web/src/components/Settings/MemberSection.tsx @@ -61,6 +61,7 @@ const MemberSection = observer(() => { const confirmArchiveUser = async () => { if (!archiveTarget) return; + const username = archiveTarget.username; await userServiceClient.updateUser({ user: { name: archiveTarget.name, @@ -69,8 +70,8 @@ const MemberSection = observer(() => { updateMask: ["state"], }); setArchiveTarget(undefined); - toast.success(t("setting.member-section.archive-success", { username: archiveTarget.username })); - fetchUsers(); + toast.success(t("setting.member-section.archive-success", { username })); + await fetchUsers(); }; const handleRestoreUserClick = async (user: User) => { @@ -83,7 +84,7 @@ const MemberSection = observer(() => { updateMask: ["state"], }); toast.success(t("setting.member-section.restore-success", { username })); - fetchUsers(); + await fetchUsers(); }; const handleDeleteUserClick = async (user: User) => { @@ -96,7 +97,7 @@ const MemberSection = observer(() => { await userStore.deleteUser(name); setDeleteTarget(undefined); toast.success(t("setting.member-section.delete-success", { username })); - fetchUsers(); + await fetchUsers(); }; return (