Files
jiapuapp/utils/discard-confirmation.js
2026-07-23 08:24:07 +08:00

35 lines
1019 B
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 放弃表单确认的唯一生命周期所有者。页面只负责把 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),
});
};