Compare commits

...
Sign in to create a new pull request.

3 commits

View file

@ -24,7 +24,6 @@ import { WebtoonImage } from '../../_models/webtoon-image';
import { ManagaReaderService } from '../../_service/managa-reader.service'; import { ManagaReaderService } from '../../_service/managa-reader.service';
import {takeUntilDestroyed} from "@angular/core/rxjs-interop"; import {takeUntilDestroyed} from "@angular/core/rxjs-interop";
import {TranslocoDirective} from "@ngneat/transloco"; import {TranslocoDirective} from "@ngneat/transloco";
import {MangaReaderComponent} from "../manga-reader/manga-reader.component";
/** /**
* How much additional space should pass, past the original bottom of the document height before we trigger the next chapter load * How much additional space should pass, past the original bottom of the document height before we trigger the next chapter load
@ -157,7 +156,7 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy {
/** /**
* Debug mode. Will show extra information. Use bitwise (|) operators between different modes to enable different output * Debug mode. Will show extra information. Use bitwise (|) operators between different modes to enable different output
*/ */
debugMode: DEBUG_MODES = DEBUG_MODES.None; debugMode: DEBUG_MODES = DEBUG_MODES.Logs | DEBUG_MODES.Outline;
/** /**
* Debug mode. Will filter out any messages in here so they don't hit the log * Debug mode. Will filter out any messages in here so they don't hit the log
*/ */
@ -299,6 +298,7 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy {
this.debugLog('[Scroll] Image is visible from scroll, isScrolling is now false'); this.debugLog('[Scroll] Image is visible from scroll, isScrolling is now false');
this.isScrolling = false; this.isScrolling = false;
this.cdRef.markForCheck(); this.cdRef.markForCheck();
return;
} }
if (!this.isScrolling) { if (!this.isScrolling) {
@ -323,6 +323,7 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy {
const img = this.findClosestVisibleImage(closestImages); const img = this.findClosestVisibleImage(closestImages);
if (img != null) { if (img != null) {
this.debugLog('[handleScrollEndEvent] setting page while not scrolling ', img.getAttribute('page') || this.pageNum);
this.setPageNum(parseInt(img.getAttribute('page') || this.pageNum + '', 10)); this.setPageNum(parseInt(img.getAttribute('page') || this.pageNum + '', 10));
} }
} }
@ -518,7 +519,10 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy {
this.renderer.setAttribute(event.target, 'width', this.mangaReaderService.maxWidth() + ''); this.renderer.setAttribute(event.target, 'width', this.mangaReaderService.maxWidth() + '');
this.renderer.setAttribute(event.target, 'height', event.target.height + ''); this.renderer.setAttribute(event.target, 'height', event.target.height + '');
this.attachIntersectionObserverElem(event.target); // Give a few milliseconds for the Ui to show the images and adjust scroll port before attaching to avoid premature intersection
const newImage = event.target;
this.attachIntersectionObserverElem(newImage)
//setTimeout(() => this.attachIntersectionObserverElem(newImage), 60);
if (imagePage === this.pageNum) { if (imagePage === this.pageNum) {
Promise.all(Array.from(this.document.querySelectorAll('img')) Promise.all(Array.from(this.document.querySelectorAll('img'))
@ -528,14 +532,21 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy {
this.debugLog('[Initialization] All images have loaded from initial prefetch, initFinished = true'); this.debugLog('[Initialization] All images have loaded from initial prefetch, initFinished = true');
this.debugLog('[Image Load] ! Loaded current page !', this.pageNum); this.debugLog('[Image Load] ! Loaded current page !', this.pageNum);
this.currentPageElem = this.document.querySelector('img#page-' + this.pageNum); this.currentPageElem = this.document.querySelector('img#page-' + this.pageNum);
// There needs to be a bit of time before we scroll
if (this.currentPageElem && !this.isElementVisible(this.currentPageElem)) {
this.scrollToCurrentPage();
} else {
this.initFinished = true;
this.cdRef.markForCheck();
}
// This scrollToCurrentPage is needed to resume from the correct page, but it also select newly inserted images
// before we are ready
if (this.currentPageElem && !this.isElementVisible(this.currentPageElem) && !this.isScrolling) {
setTimeout(() => this.scrollToCurrentPage(), 100);
}
// There needs to be a bit of time before we scroll
// if (this.currentPageElem && !this.isElementVisible(this.currentPageElem)) {
// //this.scrollToCurrentPage();
// } else {
// this.initFinished = true;
// this.cdRef.markForCheck();
// }
this.initFinished = true;
this.allImagesLoaded = true; this.allImagesLoaded = true;
this.cdRef.markForCheck(); this.cdRef.markForCheck();
}); });
@ -548,14 +559,15 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy {
return; return;
} }
entries.forEach(entry => { for(let entry of entries) {
const imagePage = parseInt(entry.target.attributes.getNamedItem('page')?.value + '', 10); const imagePage = parseInt(entry.target.attributes.getNamedItem('page')?.value + '', 10);
this.debugLog('[Intersection] Page ' + imagePage + ' is visible: ', entry.isIntersecting); this.debugLog('[Intersection] Page ' + imagePage + ' is visible: ', entry.isIntersecting);
if (entry.isIntersecting) { if (entry.isIntersecting) {
this.debugLog('[Intersection] ! Page ' + imagePage + ' just entered screen'); this.debugLog('[Intersection] ! Page ' + imagePage + ' just entered screen');
this.prefetchWebtoonImages(imagePage); this.prefetchWebtoonImages(imagePage);
break;
} }
}); }
} }
/** /**
@ -624,12 +636,12 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy {
}); });
this.allImagesLoaded = false; this.allImagesLoaded = false;
this.cdRef.markForCheck();
this.webtoonImages.next(data); this.webtoonImages.next(data);
if (!this.imagesLoaded.hasOwnProperty(page)) { if (!this.imagesLoaded.hasOwnProperty(page)) {
this.imagesLoaded[page] = page; this.imagesLoaded[page] = page;
} }
this.cdRef.markForCheck();
} }
attachIntersectionObserverElem(elem: HTMLImageElement) { attachIntersectionObserverElem(elem: HTMLImageElement) {