tldraw
Version:
A tiny little drawing editor.
8 lines (7 loc) • 3.63 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../../src/lib/ui/hooks/usePreloadAssets.ts"],
"sourcesContent": ["import { useEffect, useMemo, useState } from 'react'\nimport { TLTypeFace, preloadFont } from '../../utils/assets/preload-font'\nimport { TLEditorAssetUrls } from '../../utils/static-assets/assetUrls'\n\nenum PreloadStatus {\n\tSUCCESS,\n\tFAILED,\n\tWAITING,\n}\n\nconst usePreloadFont = (id: string, font: TLTypeFace): PreloadStatus => {\n\tconst [state, setState] = useState<PreloadStatus>(PreloadStatus.WAITING)\n\n\tuseEffect(() => {\n\t\tlet cancelled = false\n\n\t\tsetState(PreloadStatus.WAITING)\n\n\t\tpreloadFont(id, font)\n\t\t\t.then(() => {\n\t\t\t\tif (cancelled) return\n\t\t\t\tsetState(PreloadStatus.SUCCESS)\n\t\t\t})\n\t\t\t.catch((err: any) => {\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\treturn () => {\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: {\n\t\t\turl: assetUrls.fonts.draw,\n\t\t\tformat: assetUrls.fonts.draw.split('.').pop(),\n\t\t},\n\t\tserif: {\n\t\t\turl: assetUrls.fonts.serif,\n\t\t\tformat: assetUrls.fonts.serif.split('.').pop(),\n\t\t},\n\t\tsansSerif: {\n\t\t\turl: assetUrls.fonts.sansSerif,\n\t\t\tformat: assetUrls.fonts.sansSerif.split('.').pop(),\n\t\t},\n\t\tmonospace: {\n\t\t\turl: assetUrls.fonts.monospace,\n\t\t\tformat: assetUrls.fonts.monospace.split('.').pop(),\n\t\t},\n\t}\n}\n\n/** @public */\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;AAC7C,SAAqB,mBAAmB;AAGxC,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,QAAI,YAAY;AAEhB,aAAS,eAAqB;AAE9B,gBAAY,IAAI,IAAI,EAClB,KAAK,MAAM;AACX,UAAI,UAAW;AACf,eAAS,eAAqB;AAAA,IAC/B,CAAC,EACA,MAAM,CAAC,QAAa;AACpB,UAAI,UAAW;AACf,cAAQ,MAAM,GAAG;AACjB,eAAS,cAAoB;AAAA,IAC9B,CAAC;AAEF,WAAO,MAAM;AACZ,kBAAY;AAAA,IACb;AAAA,EACD,GAAG,CAAC,IAAI,IAAI,CAAC;AAEb,SAAO;AACR;AAEA,SAAS,aAAa,WAA8B;AACnD,SAAO;AAAA,IACN,MAAM;AAAA,MACL,KAAK,UAAU,MAAM;AAAA,MACrB,QAAQ,UAAU,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO;AAAA,MACN,KAAK,UAAU,MAAM;AAAA,MACrB,QAAQ,UAAU,MAAM,MAAM,MAAM,GAAG,EAAE,IAAI;AAAA,IAC9C;AAAA,IACA,WAAW;AAAA,MACV,KAAK,UAAU,MAAM;AAAA,MACrB,QAAQ,UAAU,MAAM,UAAU,MAAM,GAAG,EAAE,IAAI;AAAA,IAClD;AAAA,IACA,WAAW;AAAA,MACV,KAAK,UAAU,MAAM;AAAA,MACrB,QAAQ,UAAU,MAAM,UAAU,MAAM,GAAG,EAAE,IAAI;AAAA,IAClD;AAAA,EACD;AACD;AAGO,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"]
}