From 8554fead2a2474104f0674fb597cf86467274943 Mon Sep 17 00:00:00 2001 From: Nikita Barsukov Date: Tue, 18 Jul 2023 15:10:31 +0300 Subject: [PATCH] fix(kit): `maskitoCaretGuard` should wait for `mouseup` before execution (#372) --- projects/kit/src/lib/plugins/caret-guard.ts | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/projects/kit/src/lib/plugins/caret-guard.ts b/projects/kit/src/lib/plugins/caret-guard.ts index f9ccfe058..2d0dbeb6a 100644 --- a/projects/kit/src/lib/plugins/caret-guard.ts +++ b/projects/kit/src/lib/plugins/caret-guard.ts @@ -10,11 +10,22 @@ export function maskitoCaretGuard( ): MaskitoPlugin { return element => { const document = element.ownerDocument; + let isPointerDown = 0; + const onPointerDown = (): number => isPointerDown++; + const onPointerUp = (): number => isPointerDown--; + const listener = (): void => { if (getFocused(document) !== element) { return; } + if (isPointerDown) { + return document.addEventListener('mouseup', listener, { + once: true, + passive: true, + }); + } + const start = element.selectionStart || 0; const end = element.selectionEnd || 0; const [fromLimit, toLimit] = guard(element.value, [start, end]); @@ -27,8 +38,14 @@ export function maskitoCaretGuard( } }; - document.addEventListener('selectionchange', listener); + document.addEventListener('selectionchange', listener, {passive: true}); + document.addEventListener('mousedown', onPointerDown, {passive: true}); + document.addEventListener('mouseup', onPointerUp, {passive: true}); - return () => document.removeEventListener('selectionchange', listener); + return () => { + document.removeEventListener('selectionchange', listener); + document.removeEventListener('mousedown', onPointerDown); + document.removeEventListener('mouseup', onPointerUp); + }; }; }