diff --git a/booklore-ui/src/app/features/readers/ebook-reader/core/event.service.ts b/booklore-ui/src/app/features/readers/ebook-reader/core/event.service.ts index 8b88bbbb9..704b8d988 100644 --- a/booklore-ui/src/app/features/readers/ebook-reader/core/event.service.ts +++ b/booklore-ui/src/app/features/readers/ebook-reader/core/event.service.ts @@ -1,4 +1,4 @@ -import {inject, Injectable} from '@angular/core'; +import {inject, Injectable, NgZone} from '@angular/core'; import {Subject} from 'rxjs'; import {ReaderAnnotationService} from '../features/annotations/annotation-renderer.service'; @@ -33,6 +33,7 @@ export class ReaderEventService { private readonly SWIPE_THRESHOLD_PX = 50; private annotationService = inject(ReaderAnnotationService); + private ngZone = inject(NgZone); private view: any; private viewCallbacks: ViewCallbacks | null = null; @@ -395,7 +396,8 @@ export class ReaderEventService { } const minSpaceAbove = 120; - const showBelow = selectionTop < minSpaceAbove; + const isMobile = 'ontouchstart' in window || navigator.maxTouchPoints > 0; + const showBelow = isMobile || selectionTop < minSpaceAbove; let popupY: number; if (showBelow) { @@ -406,10 +408,12 @@ export class ReaderEventService { popupX = Math.max(100, Math.min(popupX, window.innerWidth - 150)); - this.eventSubject.next({ - type: 'text-selected', - detail: {text, cfi, range, index}, - popupPosition: {x: popupX, y: popupY, showBelow} + this.ngZone.run(() => { + this.eventSubject.next({ + type: 'text-selected', + detail: {text, cfi, range, index}, + popupPosition: {x: popupX, y: popupY, showBelow} + }); }); } }, 10);