fix(fe): debounce mask auto-run 500ms after slider/sheet changes
Rapid sensitivity drags triggered a flood of async mask runs; an in-flight run could settle after the owner pressed Approve and clobber the state, so the Approve click read a snapshot with overlay:null and early-returned. Debounce 500ms after the user stops adjusting so the mask settles before any interaction and the click reads a stable state.
This commit is contained in:
@@ -71,12 +71,17 @@
|
|||||||
let fileInput: HTMLInputElement;
|
let fileInput: HTMLInputElement;
|
||||||
|
|
||||||
// Auto-run the mask so the overlay (and preview) populate without the owner
|
// Auto-run the mask so the overlay (and preview) populate without the owner
|
||||||
// pressing Approve first. `controlKey` changes only on sheet/sensitivity
|
// pressing Approve first. Debounced 500ms after the user stops adjusting the
|
||||||
// edits (never on the overlay itself), so this fires on entry and on each
|
// sheet/sensitivity, so rapid slider drags don't trigger a flood of async
|
||||||
// control change - but not when approveMask settles the overlay (no loop).
|
// mask runs (and an in-flight run can't clobber the state around an Approve
|
||||||
|
// click). Keyed on control values, not the overlay, so settling never loops.
|
||||||
|
let maskRunTimer = 0;
|
||||||
$: controlKey = kind === 'mask' && cap.control ? `${cap.control.sheet}:${cap.control.sensitivity}` : null;
|
$: controlKey = kind === 'mask' && cap.control ? `${cap.control.sheet}:${cap.control.sensitivity}` : null;
|
||||||
$: if (controlKey && cap.source && cap.source.widthPx > 0) {
|
$: if (controlKey && cap.source && cap.source.widthPx > 0) {
|
||||||
|
clearTimeout(maskRunTimer);
|
||||||
|
maskRunTimer = setTimeout(() => {
|
||||||
void session.approveMask();
|
void session.approveMask();
|
||||||
|
}, 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
function pickFiles(e: Event) {
|
function pickFiles(e: Event) {
|
||||||
|
|||||||
Reference in New Issue
Block a user