{"version":3,"file":"useProgressiveImage.mjs","sources":["../../../../src/components/Avatar/useProgressiveImage.ts"],"sourcesContent":["import { useEffect, useState } from 'react'\n\nenum ImageEventType {\n  Load = 'load',\n  Error = 'error',\n}\n\nexport interface CachedImage {\n  src: string\n  isLoaded: boolean\n}\n\ntype ImageCacheMap = Map<string, CachedImage>\n\nconst defaultImageCache = new Map<string, CachedImage>()\n\nfunction getCachedImage(src: string, imageCache: ImageCacheMap) {\n  const cachedImage = imageCache.get(src)\n  if (!cachedImage) {\n    return null\n  }\n  return cachedImage\n}\n\nexport default function useProgressiveImage(\n  src: string,\n  defaultSrc: string,\n  imageCache: ImageCacheMap = defaultImageCache\n) {\n  const [source, setSource] = useState<CachedImage | null>(() =>\n    getCachedImage(src, imageCache)\n  )\n\n  useEffect(\n    function updateSource() {\n      if (source?.src === src) {\n        return undefined\n      }\n\n      const cachedImage = getCachedImage(src, imageCache)\n\n      if (cachedImage?.isLoaded) {\n        setSource(cachedImage)\n        return undefined\n      }\n\n      const image = new Image()\n      image.src = src\n\n      function loadImage(event: Event) {\n        const loadedImage = {\n          src,\n          isLoaded: event.type === ImageEventType.Load,\n        }\n        setSource(loadedImage)\n        imageCache.set(src, loadedImage)\n      }\n\n      image.addEventListener(ImageEventType.Load, loadImage)\n      image.addEventListener(ImageEventType.Error, loadImage)\n\n      return function cleanup() {\n        image.removeEventListener(ImageEventType.Load, loadImage)\n        image.removeEventListener(ImageEventType.Error, loadImage)\n      }\n    },\n    [src, source, imageCache]\n  )\n\n  if (!source || !source.isLoaded) {\n    return defaultSrc\n  }\n\n  return source.src\n}\n"],"names":["ImageEventType","defaultImageCache","Map","getCachedImage","src","imageCache","cachedImage","get","useProgressiveImage","defaultSrc","source","setSource","useState","useEffect","updateSource","undefined","isLoaded","image","Image","loadImage","event","loadedImage","type","Load","set","addEventListener","Error","cleanup","removeEventListener"],"mappings":";;AAA2C,IAEtCA,cAAc,0BAAdA,cAAc,EAAA;EAAdA,cAAc,CAAA,MAAA,CAAA,GAAA,MAAA;EAAdA,cAAc,CAAA,OAAA,CAAA,GAAA,OAAA;AAAA,EAAA,OAAdA,cAAc;AAAA,CAAA,CAAdA,cAAc,IAAA,EAAA,CAAA;AAYnB,MAAMC,iBAAiB,GAAG,IAAIC,GAAG,EAAuB;AAExD,SAASC,cAAcA,CAACC,GAAW,EAAEC,UAAyB,EAAE;AAC9D,EAAA,MAAMC,WAAW,GAAGD,UAAU,CAACE,GAAG,CAACH,GAAG,CAAC;EACvC,IAAI,CAACE,WAAW,EAAE;AAChB,IAAA,OAAO,IAAI;AACb;AACA,EAAA,OAAOA,WAAW;AACpB;AAEe,SAASE,mBAAmBA,CACzCJ,GAAW,EACXK,UAAkB,EAClBJ,UAAyB,GAAGJ,iBAAiB,EAC7C;AACA,EAAA,MAAM,CAACS,MAAM,EAAEC,SAAS,CAAC,GAAGC,QAAQ,CAAqB,MACvDT,cAAc,CAACC,GAAG,EAAEC,UAAU,CAChC,CAAC;AAEDQ,EAAAA,SAAS,CACP,SAASC,YAAYA,GAAG;IACtB,IAAI,CAAAJ,MAAM,KAAA,IAAA,IAANA,MAAM,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAANA,MAAM,CAAEN,GAAG,MAAKA,GAAG,EAAE;AACvB,MAAA,OAAOW,SAAS;AAClB;AAEA,IAAA,MAAMT,WAAW,GAAGH,cAAc,CAACC,GAAG,EAAEC,UAAU,CAAC;AAEnD,IAAA,IAAIC,WAAW,KAAXA,IAAAA,IAAAA,WAAW,eAAXA,WAAW,CAAEU,QAAQ,EAAE;MACzBL,SAAS,CAACL,WAAW,CAAC;AACtB,MAAA,OAAOS,SAAS;AAClB;AAEA,IAAA,MAAME,KAAK,GAAG,IAAIC,KAAK,EAAE;IACzBD,KAAK,CAACb,GAAG,GAAGA,GAAG;IAEf,SAASe,SAASA,CAACC,KAAY,EAAE;AAC/B,MAAA,MAAMC,WAAW,GAAG;QAClBjB,GAAG;AACHY,QAAAA,QAAQ,EAAEI,KAAK,CAACE,IAAI,KAAKtB,cAAc,CAACuB;OACzC;MACDZ,SAAS,CAACU,WAAW,CAAC;AACtBhB,MAAAA,UAAU,CAACmB,GAAG,CAACpB,GAAG,EAAEiB,WAAW,CAAC;AAClC;IAEAJ,KAAK,CAACQ,gBAAgB,CAACzB,cAAc,CAACuB,IAAI,EAAEJ,SAAS,CAAC;IACtDF,KAAK,CAACQ,gBAAgB,CAACzB,cAAc,CAAC0B,KAAK,EAAEP,SAAS,CAAC;IAEvD,OAAO,SAASQ,OAAOA,GAAG;MACxBV,KAAK,CAACW,mBAAmB,CAAC5B,cAAc,CAACuB,IAAI,EAAEJ,SAAS,CAAC;MACzDF,KAAK,CAACW,mBAAmB,CAAC5B,cAAc,CAAC0B,KAAK,EAAEP,SAAS,CAAC;KAC3D;GACF,EACD,CAACf,GAAG,EAAEM,MAAM,EAAEL,UAAU,CAC1B,CAAC;AAED,EAAA,IAAI,CAACK,MAAM,IAAI,CAACA,MAAM,CAACM,QAAQ,EAAE;AAC/B,IAAA,OAAOP,UAAU;AACnB;EAEA,OAAOC,MAAM,CAACN,GAAG;AACnB;;;;"}