{ "version": 3, "sources": ["../../../src/lib/utils/usePreloadAssets.ts"], "sourcesContent": ["import { useEffect, useMemo, useState } from 'react'\nimport { TLEditorAssetUrls } from './assetUrls'\n\nexport type TLTypeFace = {\n\turl: string\n\tdisplay?: any // FontDisplay\n\tfeatureSettings?: string\n\tstretch?: string\n\tstyle?: string\n\tunicodeRange?: string\n\tvariant?: string\n\tweight?: string\n}\n\nexport type TLTypeFaces = {\n\tdraw: TLTypeFace\n\tmonospace: TLTypeFace\n\tserif: TLTypeFace\n\tsansSerif: TLTypeFace\n}\n\nenum PreloadStatus {\n\tSUCCESS,\n\tFAILED,\n\tWAITING,\n}\n\nconst usePreloadFont = (id: string, font: TLTypeFace): PreloadStatus => {\n\tconst [state, setState] = useState(PreloadStatus.WAITING)\n\n\tuseEffect(() => {\n\t\tconst {\n\t\t\turl,\n\t\t\tstyle = 'normal',\n\t\t\tweight = '500',\n\t\t\tdisplay,\n\t\t\tfeatureSettings,\n\t\t\tstretch,\n\t\t\tunicodeRange,\n\t\t\tvariant,\n\t\t} = font\n\n\t\tlet cancelled = false\n\t\tsetState(PreloadStatus.WAITING)\n\n\t\tconst descriptors: FontFaceDescriptors = {\n\t\t\tstyle,\n\t\t\tweight,\n\t\t\tdisplay,\n\t\t\tfeatureSettings,\n\t\t\tstretch,\n\t\t\tunicodeRange,\n\t\t\tvariant,\n\t\t}\n\n\t\tconst fontInstance = new FontFace(id, `url(${url})`, descriptors)\n\n\t\tfontInstance\n\t\t\t.load()\n\t\t\t.then(() => {\n\t\t\t\tif (cancelled) return\n\t\t\t\tdocument.fonts.add(fontInstance)\n\t\t\t\tsetState(PreloadStatus.SUCCESS)\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tif (cancelled) return\n\t\t\t\tconsole.error(err)\n\t\t\t\tsetState(PreloadStatus.FAILED)\n\t\t\t})\n\n\t\t// @ts-expect-error\n\t\tfontInstance.$$_url = url\n\n\t\t// @ts-expect-error\n\t\tfontInstance.$$_fontface = `\n@font-face {\n\tfont-family: ${fontInstance.family};\n\tfont-stretch: ${fontInstance.stretch};\n\tfont-weight: ${fontInstance.weight};\n\tfont-style: ${fontInstance.style};\n\tsrc: url(\"${url}\") format(\"woff2\")\n}`\n\n\t\treturn () => {\n\t\t\tdocument.fonts.delete(fontInstance)\n\t\t\tcancelled = true\n\t\t}\n\t}, [id, font])\n\n\treturn state\n}\n\nfunction getTypefaces(assetUrls: TLEditorAssetUrls) {\n\treturn {\n\t\tdraw: { url: assetUrls.fonts.draw },\n\t\tserif: { url: assetUrls.fonts.serif },\n\t\tsansSerif: { url: assetUrls.fonts.sansSerif },\n\t\tmonospace: { url: assetUrls.fonts.monospace },\n\t}\n}\n\n// todo: Expose this via a public API (prop on ).\n\nexport function usePreloadAssets(assetUrls: TLEditorAssetUrls) {\n\tconst typefaces = useMemo(() => getTypefaces(assetUrls), [assetUrls])\n\n\tconst results = [\n\t\tusePreloadFont('tldraw_draw', typefaces.draw),\n\t\tusePreloadFont('tldraw_serif', typefaces.serif),\n\t\tusePreloadFont('tldraw_sans', typefaces.sansSerif),\n\t\tusePreloadFont('tldraw_mono', typefaces.monospace),\n\t]\n\n\treturn {\n\t\t// If any of the results have errored, then preloading has failed\n\t\terror: results.some((result) => result === PreloadStatus.FAILED),\n\t\t// If any of the results are waiting, then we're not done yet\n\t\tdone: !results.some((result) => result === PreloadStatus.WAITING),\n\t}\n}\n"], "mappings": "AAAA,SAAS,WAAW,SAAS,gBAAgB;AAqB7C,IAAK,gBAAL,kBAAKA,mBAAL;AACC,EAAAA,8BAAA;AACA,EAAAA,8BAAA;AACA,EAAAA,8BAAA;AAHI,SAAAA;AAAA,GAAA;AAML,MAAM,iBAAiB,CAAC,IAAY,SAAoC;AACvE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,eAAqB;AAEvE,YAAU,MAAM;AACf,UAAM;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,IAAI;AAEJ,QAAI,YAAY;AAChB,aAAS,eAAqB;AAE9B,UAAM,cAAmC;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAEA,UAAM,eAAe,IAAI,SAAS,IAAI,OAAO,GAAG,KAAK,WAAW;AAEhE,iBACE,KAAK,EACL,KAAK,MAAM;AACX,UAAI;AAAW;AACf,eAAS,MAAM,IAAI,YAAY;AAC/B,eAAS,eAAqB;AAAA,IAC/B,CAAC,EACA,MAAM,CAAC,QAAQ;AACf,UAAI;AAAW;AACf,cAAQ,MAAM,GAAG;AACjB,eAAS,cAAoB;AAAA,IAC9B,CAAC;AAGF,iBAAa,SAAS;AAGtB,iBAAa,cAAc;AAAA;AAAA,gBAEb,aAAa,MAAM;AAAA,iBAClB,aAAa,OAAO;AAAA,gBACrB,aAAa,MAAM;AAAA,eACpB,aAAa,KAAK;AAAA,aACpB,GAAG;AAAA;AAGd,WAAO,MAAM;AACZ,eAAS,MAAM,OAAO,YAAY;AAClC,kBAAY;AAAA,IACb;AAAA,EACD,GAAG,CAAC,IAAI,IAAI,CAAC;AAEb,SAAO;AACR;AAEA,SAAS,aAAa,WAA8B;AACnD,SAAO;AAAA,IACN,MAAM,EAAE,KAAK,UAAU,MAAM,KAAK;AAAA,IAClC,OAAO,EAAE,KAAK,UAAU,MAAM,MAAM;AAAA,IACpC,WAAW,EAAE,KAAK,UAAU,MAAM,UAAU;AAAA,IAC5C,WAAW,EAAE,KAAK,UAAU,MAAM,UAAU;AAAA,EAC7C;AACD;AAIO,SAAS,iBAAiB,WAA8B;AAC9D,QAAM,YAAY,QAAQ,MAAM,aAAa,SAAS,GAAG,CAAC,SAAS,CAAC;AAEpE,QAAM,UAAU;AAAA,IACf,eAAe,eAAe,UAAU,IAAI;AAAA,IAC5C,eAAe,gBAAgB,UAAU,KAAK;AAAA,IAC9C,eAAe,eAAe,UAAU,SAAS;AAAA,IACjD,eAAe,eAAe,UAAU,SAAS;AAAA,EAClD;AAEA,SAAO;AAAA;AAAA,IAEN,OAAO,QAAQ,KAAK,CAAC,WAAW,WAAW,cAAoB;AAAA;AAAA,IAE/D,MAAM,CAAC,QAAQ,KAAK,CAAC,WAAW,WAAW,eAAqB;AAAA,EACjE;AACD;", "names": ["PreloadStatus"] }