Advertisement
Guest User

Untitled

a guest
Mar 27th, 2017
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.75 KB | None | 0 0
  1. import { Directive, HostListener, ElementRef, Output, Input, EventEmitter, AfterContentInit } from '@angular/core';
  2. import { Observable } from 'rxjs/Rx'
  3. import 'rxjs/add/observable/fromEvent';
  4. import 'rxjs/add/operator/map';
  5. import 'rxjs/add/operator/filter';
  6. import 'rxjs/add/operator/takeUntil';
  7. import 'rxjs/add/operator/concatMap';
  8. import { Subject } from 'rxjs/Subject';
  9.  
  10. @Directive({
  11. selector: '[swipeEvent]'
  12. })
  13. export class SwipeEventDirective implements AfterContentInit {
  14.  
  15. @Input() swipeWidth;
  16. @Output() onSwipeEvent = new EventEmitter();
  17.  
  18. constructor(private el: ElementRef) { }
  19.  
  20. ngAfterContentInit() {
  21. this.moveAndDelete('mousedown', 'mousemove', 'mouseup', 'mouseout');
  22. this.moveAndDelete('touchstart', 'touchmove', 'touchend', 'touchcancel');
  23. }
  24.  
  25. private moveEle = ele => px => ele.style.transform = 'translateX('+ px +'px)';
  26.  
  27. private resetPos = ele => () => ele.style.transform = 'translateX(0px)';
  28.  
  29. private emitEvent = px => {
  30. if(Math.abs(px) > this.swipeWidth) {
  31. this.onSwipeEvent.emit({right: px > 0});
  32. return true;
  33. }
  34. return false;
  35. }
  36.  
  37. private getX = ev => {
  38. if(ev.screenX) {
  39. return ev.screenX;
  40. } else if(ev.touches && ev.touches[0].screenX) {
  41. return ev.touches[0].screenX;
  42. }
  43. return false;
  44. }
  45.  
  46. private moveAndDelete = (evStart:string, evMove:string, evEnd:string, evCancel:string) => {
  47. const start: Observable<any> = Observable.fromEvent(this.el.nativeElement, evStart);
  48. const move: Observable<any> = Observable.fromEvent(this.el.nativeElement, evMove);
  49. const end: Observable<any> = Observable.fromEvent(this.el.nativeElement, evEnd);
  50. const cancel: Observable<any> = Observable.fromEvent(this.el.nativeElement, evCancel);
  51. const moveEle: Function = this.moveEle(this.el.nativeElement.querySelector('.container'));
  52. const resetPos = this.resetPos(this.el.nativeElement.querySelector('.container'));
  53. const eventEmitted = new Subject<string>();
  54.  
  55. start
  56. .map( ev => this.getX(ev) )
  57. .concatMap( start =>
  58. move
  59. .map(ev => {
  60. const delta: number = this.getX(ev) - start;
  61. moveEle(delta);
  62. if(this.emitEvent(delta)) {
  63. eventEmitted.next();
  64. resetPos();
  65. }
  66. })
  67. .takeUntil(cancel)
  68. .takeUntil(end)
  69. .takeUntil(eventEmitted)
  70. )
  71. .subscribe();
  72. cancel.subscribe(resetPos)
  73. end.subscribe(resetPos)
  74. }
  75.  
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement