{"version":3,"file":"cap-image-cache.mjs","sources":["../../../projects/cap-image-cache/src/lib/cap-image-cache.service.ts","../../../projects/cap-image-cache/src/lib/cap-image-cache.directive.ts","../../../projects/cap-image-cache/src/public-api.ts","../../../projects/cap-image-cache/src/cap-image-cache.ts"],"sourcesContent":["import { Inject, Injectable, InjectionToken } from '@angular/core';\nimport { Filesystem, Directory, WriteFileResult } from '@capacitor/filesystem';\n\nexport const CACHE_PATH = new InjectionToken<string>('CACHE_PATH');\nexport interface ImageCacheResult {\n  data?: string;\n  from?: 'cache' | 'network';\n}\n@Injectable({ providedIn: 'any' })\nexport class CapImageCacheService {\n  constructor(@Inject(CACHE_PATH) private cachePath: string = 'CACHE_IMAGES') {}\n  public async getImageSrc(_url: string): Promise<ImageCacheResult> {\n    let newUrl = new URL(_url);\n    const imageName = newUrl.pathname.split('/').pop();\n    const imageType = (imageName || _url).split('.').pop();\n    try {\n      const readFile = await Filesystem.readFile({\n        directory: Directory.Cache,\n        path: this.cachePath + '/' + imageName,\n      });\n      return {\n        data: `data:image/${imageType};base64,${readFile.data}`,\n        from: 'cache',\n      };\n    } catch (e) {\n      try {\n        await this.storeImage(_url, imageName || _url);\n        const readFile = await Filesystem.readFile({\n          directory: Directory.Cache,\n          path: this.cachePath + '/' + imageName,\n        });\n        return {\n          data: `data:image/${imageType};base64,${readFile.data}`,\n          from: 'network',\n        };\n      } catch (error) {\n        throw new Error(\"there's a network error 2\");\n      }\n    }\n  }\n  private async storeImage(\n    url: string,\n    path: string\n  ): Promise<WriteFileResult | unknown> {\n    try {\n      const response = await fetch(url);\n      const blob = await response.blob();\n      if (blob.type === 'text/html') {\n        console.error('response wan not an image');\n        throw new Error('There was an error while loading an image');\n      }\n      const base64Data = await this.convertBlobToBase64(blob);\n      const savedFile = await Filesystem.writeFile({\n        directory: Directory.Cache,\n        data: base64Data,\n        path: this.cachePath + '/' + path,\n        recursive: true,\n      });\n      return savedFile;\n    } catch (error: unknown) {\n      throw new Error(\"there's a network error\");\n    }\n  }\n  private convertBlobToBase64(blob: Blob): Promise<string> {\n    return new Promise((resolve, reject) => {\n      const reader = new FileReader();\n      reader.onerror = reject;\n      reader.onload = () => {\n        if (reader !== null) {\n          const res = reader.result || '';\n          resolve(res.toString());\n        } else {\n          reject('Error #F00');\n        }\n      };\n      reader.readAsDataURL(blob);\n    });\n  }\n}\n","import { AfterViewInit, Directive, ElementRef, Input } from '@angular/core';\nimport { CapImageCacheService } from './cap-image-cache.service';\n\n@Directive({ selector: '[cache-img]' })\nexport class CapImageCacheDirective implements AfterViewInit {\n  @Input('cache-img') _src: string | undefined;\n  @Input('lazy') _lazy: boolean = false;\n  private _alreadyRendered: boolean = false;\n  private _observer: IntersectionObserver | undefined;\n  constructor(\n    private readonly element: ElementRef,\n    private capImageCacheService: CapImageCacheService\n  ) {}\n\n  async ngAfterViewInit() {\n    if (this._lazy) {\n      this.startObserving();\n    } else {\n      this.loadImage();\n    }\n  }\n  private async loadImage() {\n    if (this._src) {\n      try {\n        const result = await this.capImageCacheService.getImageSrc(this._src);\n        if (this.element.nativeElement.nodeName !== 'IMG') {\n          this.element.nativeElement.style.backgroundImage = `url('${result.data}')`;\n        } else {\n          this.element.nativeElement.src = result.data;\n        }\n        console.info(this._src, 'Loaded successfully from', result.from);\n      } catch (error) {\n        throw new Error('cannot load image check your url');\n      }\n    } else {\n      throw new Error('image src url is not set');\n    }\n  }\n  private startObserving() {\n    this._observer = new IntersectionObserver(\n      (entries) => {\n        entries.forEach((entry) => {\n          this.renderContents(entry.isIntersecting);\n        });\n      },\n      { threshold: [0, 0.1, 0.9, 1] }\n    );\n    this._observer?.observe(this.element.nativeElement);\n  }\n  private renderContents(isInView: boolean) {\n    if (isInView) {\n      if (!this._alreadyRendered) {\n        this._alreadyRendered = true;\n        this._observer?.disconnect();\n        this.loadImage();\n      }\n    }\n  }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CapImageCacheDirective } from './lib/cap-image-cache.directive';\nimport {\n  CACHE_PATH,\n  CapImageCacheService,\n} from './lib/cap-image-cache.service';\n\nexport * from './lib/cap-image-cache.service';\nexport * from './lib/cap-image-cache.directive';\n\nexport class CapImageCacheConfig {\n  cachePath?: string;\n}\n@NgModule({\n  declarations: [CapImageCacheDirective],\n  exports: [CapImageCacheDirective],\n})\nexport class CapImageCacheModule {\n  static forRoot(\n    config: CapImageCacheConfig = {}\n  ): ModuleWithProviders<CapImageCacheModule> {\n    return {\n      ngModule: CapImageCacheModule,\n      providers: [\n        { provide: CACHE_PATH, useValue: config.cachePath },\n        { provide: CapImageCacheService, useValue: config },\n      ],\n    };\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}