@@ -127,6 +127,12 @@ type PdfElementsInstance = {
127127 selectedDocIndex? : number
128128 autoFitZoom? : boolean
129129}
130+ type PdfElementsRuntimeInstance = PdfElementsInstance & {
131+ handleMouseMove? : (event : { type: string , touches: Array <{ clientX: number , clientY: number }> }) => void
132+ finishAdding? : () => void
133+ previewElement? : Record <string , unknown > | null
134+ previewVisible? : boolean
135+ }
130136
131137defineOptions ({
132138 name: ' PdfEditor' ,
@@ -155,6 +161,7 @@ const pdfElements = ref<PdfElementsInstance | null>(null)
155161const pendingAddedObjectCount = ref <number | null >(null )
156162
157163let pendingAddCheckTimer: ReturnType <typeof setTimeout > | null = null
164+ let pendingAddCheckRetries = 0
158165
159166const ignoreClickOutsideSelectors = computed (() => [' .action-item__popper' , ' .action-item' ])
160167
@@ -271,6 +278,7 @@ function clearPendingAddCheck() {
271278 clearTimeout (pendingAddCheckTimer )
272279 pendingAddCheckTimer = null
273280 }
281+ pendingAddCheckRetries = 0
274282 pendingAddedObjectCount .value = null
275283}
276284
@@ -283,11 +291,29 @@ function checkSignerAdded() {
283291 pendingAddCheckTimer = null
284292 const isAddingMode = pdfElements .value ?.isAddingMode === true
285293 const objectsAfter = getTotalObjectsCount ()
286- pendingAddedObjectCount .value = null
287294
288- if (! isAddingMode && objectsAfter > objectsBefore ) {
295+ if (objectsAfter > objectsBefore ) {
296+ clearPendingAddCheck ()
289297 emit (' pdf-editor:signer-added' )
298+ return
299+ }
300+
301+ // Fallback: once add mode ends, unblock the UI even if the object count
302+ // comparison was not conclusive due timing/reactivity.
303+ if (! isAddingMode ) {
304+ clearPendingAddCheck ()
305+ emit (' pdf-editor:signer-added' )
306+ return
290307 }
308+
309+ // Poll while the external component still processes placement.
310+ if (pendingAddCheckRetries < 300 ) {
311+ pendingAddCheckRetries ++
312+ pendingAddCheckTimer = setTimeout (checkSignerAdded , 100 )
313+ return
314+ }
315+
316+ clearPendingAddCheck ()
291317}
292318
293319function scheduleSignerAddedCheck() {
@@ -300,6 +326,38 @@ function scheduleSignerAddedCheck() {
300326 pendingAddCheckTimer = setTimeout (checkSignerAdded , 0 )
301327}
302328
329+ function handleDocumentTouchEnd(event : Event ) {
330+ if (pendingAddedObjectCount .value === null ) {
331+ return
332+ }
333+
334+ const instance = pdfElements .value as PdfElementsRuntimeInstance | null
335+ const touchEvent = event as TouchEvent
336+ const touchPoint = touchEvent .changedTouches ?.[0 ]
337+ if (! instance || ! touchPoint ) {
338+ scheduleSignerAddedCheck ()
339+ return
340+ }
341+
342+ // Work around mobile tap placement timing in pdf-elements: touchend has no
343+ // touches[0], so preview may never become visible on first tap.
344+ if (instance .isAddingMode && instance .previewElement && ! instance .previewVisible && instance .handleMouseMove ) {
345+ instance .handleMouseMove ({
346+ type: ' touchmove' ,
347+ touches: [{ clientX: touchPoint .clientX , clientY: touchPoint .clientY }],
348+ })
349+ requestAnimationFrame (() => {
350+ if (instance .isAddingMode ) {
351+ instance .finishAdding ?.()
352+ }
353+ scheduleSignerAddedCheck ()
354+ })
355+ return
356+ }
357+
358+ scheduleSignerAddedCheck ()
359+ }
360+
303361function startAddingSigner(signer : SignerSummaryRecord | SignerDetailRecord | null | undefined , size : { width? : number , height? : number }) {
304362 if (! pdfElements .value || ! size ?.width || ! size ?.height ) {
305363 return false
@@ -319,6 +377,11 @@ function startAddingSigner(signer: SignerSummaryRecord | SignerDetailRecord | nu
319377 signer: signerPayload ,
320378 })
321379 pendingAddedObjectCount .value = getTotalObjectsCount ()
380+ pendingAddCheckRetries = 0
381+ if (pendingAddCheckTimer !== null ) {
382+ clearTimeout (pendingAddCheckTimer )
383+ }
384+ pendingAddCheckTimer = setTimeout (checkSignerAdded , 100 )
322385
323386 return true
324387}
@@ -383,15 +446,11 @@ async function waitForPageRender(docIndex: number, pageIndex: number) {
383446
384447onMounted (() => {
385448 ensurePdfWorker ()
386- document .addEventListener (' mouseup' , scheduleSignerAddedCheck )
387- document .addEventListener (' touchend' , scheduleSignerAddedCheck )
388- document .addEventListener (' keyup' , scheduleSignerAddedCheck )
449+ document .addEventListener (' touchend' , handleDocumentTouchEnd )
389450})
390451
391452onBeforeUnmount (() => {
392- document .removeEventListener (' mouseup' , scheduleSignerAddedCheck )
393- document .removeEventListener (' touchend' , scheduleSignerAddedCheck )
394- document .removeEventListener (' keyup' , scheduleSignerAddedCheck )
453+ document .removeEventListener (' touchend' , handleDocumentTouchEnd )
395454 clearPendingAddCheck ()
396455})
397456
0 commit comments