35 lines
1019 B
JavaScript
35 lines
1019 B
JavaScript
// 放弃表单确认的唯一生命周期所有者。页面只负责把 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),
|
||
});
|
||
};
|