import { Component, Input, Output, EventEmitter, ContentChild, TemplateRef, ViewChild } from '@angular/core';
import { Slides } from 'ionic-angular';
@Component({
selector: 'vb-virtual-slides',
template: `
`
})
export class VirtualBeamsVirtualSlides {
@Input()
public items: any[];
@Input()
public pager: boolean;
@Input()
public set lockSwipeToNext(value: boolean) {
if (typeof value === 'boolean' && this.slides) {
this.slides.lockSwipeToNext(value);
}
}
@Input()
public set lockSwipeToPrev(value: boolean) {
if (typeof value === 'boolean' && this.slides) {
this.slides.lockSwipeToNext(value);
}
}
@Output()
public currentIndex: EventEmitter = new EventEmitter();
@Output()
public onLoadSlides: EventEmitter = new EventEmitter();
@Output()
public ionSlideAutoplay: EventEmitter = new EventEmitter();
@Output()
public ionSlideAutoplayStart: EventEmitter = new EventEmitter();
@Output()
public ionSlideAutoplayStop: EventEmitter = new EventEmitter();
@Output()
public ionSlideDidChange: EventEmitter = new EventEmitter();
@Output()
public ionSlideDoubleTap: EventEmitter = new EventEmitter();
@Output()
public ionSlideDrag: EventEmitter = new EventEmitter();
@Output()
public ionSlideNextEnd: EventEmitter = new EventEmitter();
@Output()
public ionSlideNextStart: EventEmitter = new EventEmitter();
@Output()
public ionSlidePrevEnd: EventEmitter = new EventEmitter();
@Output()
public ionSlidePrevStart: EventEmitter = new EventEmitter();
@Output()
public ionSlideReachEnd: EventEmitter = new EventEmitter();
@Output()
public ionSlideReachStart: EventEmitter = new EventEmitter();
@Output()
public ionSlideTap: EventEmitter = new EventEmitter();
@Output()
public ionSlideWillChange: EventEmitter = new EventEmitter();
@ContentChild('content') content: TemplateRef;
@ViewChild(Slides)
public slides: Slides;
indexDisplayed: number;
start: number;
end: number;
renderItems: any[] = new Array(3);
constructor() {
}
public initSlides() {
const end = this.items.length > 2 ? 3 : this.items.length;
this.indexDisplayed = 0;
this.start = 0;
this.end = end;
this.renderItems = this.items.slice(0, end);
this.emitCurrentIndex();
}
ngOnInit() {
this.onLoadSlides.emit(this.slides);
this.initSlides();
}
onSlideAutoplay(event: Slides) {
this.ionSlideAutoplay.emit(event);
}
onSlideAutoplayStart(event: Slides) {
this.ionSlideAutoplayStart.emit(event);
}
onSlideAutoplayStop(event: Slides) {
this.ionSlideAutoplayStop.emit(event);
}
onSlideDidChange(event: Slides) {
this.emitCurrentIndex();
this.ionSlideDidChange.emit(event);
}
onSlideDoubleTap(event: Slides) {
this.ionSlideDoubleTap.emit(event);
}
onSlideDrag(event: Slides) {
this.ionSlideDrag.emit(event);
}
onSlideNextEnd(event: Slides) {
if (this.end < this.items.length) {
if (event._activeIndex === 2) this.sliceOriginalArray(++this.start, ++this.end);
this.indexDisplayed++;
this.slides.slideTo(1, 0, false);
} else if (this.indexDisplayed < (this.items.length - 1)) {
this.indexDisplayed++;
}
this.slides.onlyExternal = false;
this.ionSlideNextEnd.emit(event);
}
onSlideNextStart(event: Slides) {
this.ionSlideNextStart.emit(event);
}
onSlidePrevEnd(event: Slides) {
const next = event._activeIndex == 0 && this.start == 0 ? 0 : 1;
if (this.start > 0 && event._activeIndex == 0) {
this.sliceOriginalArray(--this.start, --this.end);
}
if (this.start < this.indexDisplayed) {
this.indexDisplayed--;
}
this.lockSwipeToNext = false;
this.slides.slideTo(next, 0, false);
this.slides.onlyExternal = false;
this.ionSlidePrevEnd.emit(event);
}
onSlidePrevStart(event: Slides) {
this.ionSlidePrevStart.emit(event);
}
onSlideReachEnd(event: Slides) {
this.ionSlideReachEnd.emit(event);
}
onSlideReachStart(event: Slides) {
this.ionSlideReachStart.emit(event);
}
onSlideTap(event: Slides) {
this.ionSlideTap.emit(event);
}
onSlideWillChange(event: Slides) {
this.slides.onlyExternal = true;
this.ionSlideWillChange.emit(event);
}
public getRealIndex(currentIndex: number): number {
let realIndex = this.start;
switch (currentIndex) {
case 1:
realIndex += 1;
break;
case 2:
realIndex += 2;
break;
case 3:
realIndex = this.end - 1;
break;
default:
break;
}
return realIndex;
}
private sliceOriginalArray(start, end) {
this.renderItems = this.items.slice(start, end);
}
private emitCurrentIndex(): void {
const activeIndex = this.slides.getActiveIndex();
const realIndex = this.getRealIndex(activeIndex);
this.currentIndex.emit(realIndex);
}
}