// Meldung, wenn eine Projektdatei bereits in einer anderen Instanz gesperrt ist // (Lock-Konflikt, s. src/io/projectFile.ts acquireProjectLock). Ersetzt // `window.confirm` (im Tauri-WKWebView deaktiviert) — gleiches Overlay-Muster // wie PromptDialog (imp-overlay/imp-dialog/imp-head/imp-body/imp-foot/imp-btn). import { useEffect } from "react"; import { t } from "../i18n"; import type { LockInfo } from "../io/projectFile"; export interface LockConflictDialogProps { /** Info aus der Lock-Sidecar-Datei (pid/hostname/timestamp) — kann fehlen. */ info: LockInfo | null; /** Projekt ohne Lock nur lesend öffnen (kein Schreibzugriff-Anspruch). */ onReadOnly: () => void; /** Lock ignorieren und trotzdem schreibend öffnen (Risiko: zwei Schreiber). */ onForceOpen: () => void; onCancel: () => void; } export function LockConflictDialog({ info, onReadOnly, onForceOpen, onCancel, }: LockConflictDialogProps) { useEffect(() => { const onKey = (e: KeyboardEvent) => { if (e.key === "Escape") onCancel(); }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [onCancel]); return (
e.stopPropagation()} >
{t("lock.title")}
{t("lock.message")}
{info && (
{t("lock.messageInfo", { host: info.hostname, pid: String(info.pid) })}
)}
); }