From a4cce3d3bb8613e1be5aeaac60bd58a8abdc2d3b Mon Sep 17 00:00:00 2001 From: Louis Bompart Date: Tue, 18 Feb 2025 13:51:13 -0500 Subject: [PATCH] feat: cache icons request by url todo: ut --- .../common/atomic-icon/atomic-icon.ts | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/atomic/src/components/common/atomic-icon/atomic-icon.ts b/packages/atomic/src/components/common/atomic-icon/atomic-icon.ts index 98037cda29..a2f7fed8c2 100644 --- a/packages/atomic/src/components/common/atomic-icon/atomic-icon.ts +++ b/packages/atomic/src/components/common/atomic-icon/atomic-icon.ts @@ -45,6 +45,7 @@ export class AtomicIcon TailwindLitElement.styles, unsafeCSS(styles), ]; + static iconMap: WeakRef>; /** * The SVG icon to display. * @@ -59,7 +60,22 @@ export class AtomicIcon @state() private svg: string | null = null; + private _iconMap: Map; + + constructor() { + super(); + let candidateIconMap = AtomicIcon.iconMap?.deref(); + if (!candidateIconMap) { + candidateIconMap = new Map(); + AtomicIcon.iconMap = new WeakRef(candidateIconMap); + } + this._iconMap = candidateIconMap; + } + private async fetchIcon(url: string) { + if (this._iconMap.has(url)) { + return this._iconMap.get(url); + } try { const response = await fetch(url).catch((e) => { throw IconFetchError.fromError(url, e); @@ -71,7 +87,9 @@ export class AtomicIcon response.statusText ); } - return await response.text(); + const svg = await response.text(); + this._iconMap.set(url, svg); + return svg; } catch (e) { this.error = e as Error; this.requestUpdate();