@playcanvas/react
Version:
A React renderer for PlayCanvas – build interactive 3D applications using React's declarative paradigm.
61 lines • 2.14 kB
JavaScript
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