// 放弃表单确认的唯一生命周期所有者。页面只负责把 visible 同步到自己的 ref; // 重复返回复用同一 Promise,确认、取消或卸载都会先清空内部状态再释放等待者。 export const createDiscardConfirmation = (setVisible) => { if (typeof setVisible !== "function") { throw new TypeError("createDiscardConfirmation 的 setVisible 必须是函数"); } let pendingPromise = null; let resolvePending = null; const settle = (confirmed) => { const resolve = resolvePending; resolvePending = null; pendingPromise = null; setVisible(false); resolve?.(confirmed === true); }; const request = () => { if (pendingPromise) return pendingPromise; setVisible(true); pendingPromise = new Promise((resolve) => { resolvePending = resolve; }); return pendingPromise; }; return Object.freeze({ request, confirm: () => settle(true), cancel: () => settle(false), dispose: () => settle(false), }); };