Files
NetMesh/components/vault/VaultDeleteConfirmDialog.tsx
zhaolei 3c72efcb7f
Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
[Init] Initial commit - NetMesh terminal manager
2026-09-13 18:24:01 +08:00

113 lines
2.7 KiB
TypeScript

import { AlertTriangle } from "lucide-react";
import React from "react";
import { useI18n } from "../../application/i18n/I18nProvider";
import { Button } from "../ui/button";
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
} from "../ui/dialog";
interface VaultDeleteConfirmDialogProps {
open: boolean;
title: string;
description: string;
confirmLabel?: string;
disabled?: boolean;
onOpenChange: (open: boolean) => void;
onConfirm: () => void;
}
interface VaultDeleteConfirmDialogContentProps {
title: string;
description: string;
descriptionId?: string;
cancelLabel: string;
confirmLabel: string;
disabled?: boolean;
onCancel: () => void;
onConfirm: () => void;
}
export const VaultDeleteConfirmDialogContent: React.FC<VaultDeleteConfirmDialogContentProps> = ({
title,
description,
descriptionId,
cancelLabel,
confirmLabel,
disabled = false,
onCancel,
onConfirm,
}) => {
return (
<>
<DialogHeader className="min-w-0 pr-6">
<DialogTitle className="flex min-w-0 items-center gap-2 text-destructive">
<AlertTriangle size={20} className="shrink-0" />
<span className="min-w-0 truncate">{title}</span>
</DialogTitle>
<DialogDescription
id={descriptionId}
className="break-words [overflow-wrap:anywhere]"
>
{description}
</DialogDescription>
</DialogHeader>
<DialogFooter className="gap-2 sm:gap-0">
<Button
variant="outline"
onClick={onCancel}
disabled={disabled}
>
{cancelLabel}
</Button>
<Button
variant="destructive"
onClick={onConfirm}
disabled={disabled}
>
{confirmLabel}
</Button>
</DialogFooter>
</>
);
};
export const VaultDeleteConfirmDialog: React.FC<VaultDeleteConfirmDialogProps> = ({
open,
title,
description,
confirmLabel,
disabled = false,
onOpenChange,
onConfirm,
}) => {
const { t } = useI18n();
const descriptionId = React.useId();
return (
<Dialog open={open} onOpenChange={(nextOpen) => {
if (!disabled) onOpenChange(nextOpen);
}}>
<DialogContent
className="max-w-[calc(100vw-2rem)] overflow-hidden sm:max-w-[400px]"
aria-describedby={descriptionId}
>
<VaultDeleteConfirmDialogContent
title={title}
description={description}
descriptionId={descriptionId}
cancelLabel={t("common.cancel")}
confirmLabel={confirmLabel ?? t("action.delete")}
disabled={disabled}
onCancel={() => onOpenChange(false)}
onConfirm={onConfirm}
/>
</DialogContent>
</Dialog>
);
};