Skip to content

Instantly share code, notes, and snippets.

View realtomaszkula's full-sized avatar

Tomasz Kula realtomaszkula

View GitHub Profile
private lazyLoad() {
const obs = new IntersectionObserver(entries => {
entries.forEach(({ isIntersecting }) => {
if (isIntersecting) {
this.srcAttr = this.src;
obs.unobserve(this.el.nativeElement);
}
});
});
obs.observe(this.el.nativeElement);
import { AfterViewInit, Directive, ElementRef, HostBinding, Input } from '@angular/core';
@Directive({
selector: 'img[appLazyLoad]'
})
export class LazyLoadDirective implements AfterViewInit {
@HostBinding('attr.src') srcAttr = null;
@Input() src: string;
constructor(private el: ElementRef) {}
@Directive({
selector: '[appProgressiveImageFallback]',
providers: [...]
})
export class ProgressiveImageFallbackDirective implements OnInit, Dimensions {
// ...
@HostBinding('style.display') display = Display.flex;
constructor(private imageState: ImageStateService) {}
@Directive({
selector: '[appProgressiveImagePlaceholder]',
providers: [...]
})
export class ProgressiveImagePlaceholderDirective implements OnInit, Dimensions {
// ...
@HostBinding('style.display') display = Display.flex;
constructor(private imageState: ImageStateService) {}
@Directive({
selector: 'img[appProgressiveImage]',
providers: [...]
})
export class ProgressiveImageDirective implements OnInit, Dimensions {
// ...
@HostBinding('style.display') display = Display.flex;
constructor(private imageState: ImageStateService) {}
export enum Display {
flex = 'flex',
none = 'none'
}
@Directive({
selector: 'img[appProgressiveImage]',
providers: [{
provide: Dimensions,
useExisting: forwardRef(() => ProgressiveImageDirective)
}]
})
export class ProgressiveImageDirective implements OnInit, Dimensions {
@HostBinding('style.width.px')
width: number;
@Component({
selector: 'app-progressive-image',
template: `<ng-content></ng-content>`,
providers: [ImageStateService]
})
export class ProgressiveImageComponent implements AfterContentChecked {}
enum ImageState {
loading = 'loading',
error = 'error',
loaded = 'loaded'
}
@Injectable()
export class ImageStateService {
private stateSource = new Subject<ImageState>();
private state$ = this.stateSource;
@Directive({
selector: 'img[appProgressiveImage]',
providers: [{
provide: Dimensions,
useExisting: forwardRef(() => ProgressiveImageDirective)
}]
})
export class ProgressiveImageDirective implements OnInit, Dimensions {}
@Directive({