UNPKG

@playcanvas/react

Version:

A React renderer for PlayCanvas – build interactive 3D applications using React's declarative paradigm.

61 lines 2.14 kB
import { Asset } from "playcanvas"; import { warnOnce } from "./validation.js"; export const fetchAsset = ({ app, url, type, props = {}, onProgress }) => { return new Promise((resolve, reject) => { let propsKey = url; try { propsKey += JSON.stringify(props, Object.keys(props).sort()); } catch { const error = `Invalid props for "fetchAsset({ url: '${url}', type: '${type}' })". \`props\` must be serializable to JSON.`; warnOnce(error); throw new Error(error); } let asset = app.assets.find(propsKey, type); if (!asset) { asset = new Asset(propsKey, type, { url, ...(props.file ?? {}) }, props.data ?? {}, props.options ?? {}); app.assets.add(asset); } const handleLoad = () => { cleanup(); onProgress?.({ progress: 1 }); resolve(asset); }; const handleError = (err) => { cleanup(); reject(err); }; const handleProgress = (totalReceived, totalRequired) => { if (typeof totalReceived !== 'number' || typeof totalRequired !== 'number') { warnOnce('Invalid progress callback parameters'); return; } onProgress?.({ progress: totalReceived / totalRequired, totalReceived, totalRequired }); }; const cleanup = () => { if (onProgress) asset.off('progress', handleProgress); asset.off('load', handleLoad); asset.off('error', handleError); }; if (onProgress) { asset.on('progress', handleProgress); } if (asset.resource) { handleLoad(); } else { asset.once('load', handleLoad); asset.once('error', handleError); // Start loading if not already loading if (!asset.loading) { app.assets.load(asset); } } }); }; //# sourceMappingURL=fetch-asset.js.map