mylingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
51 lines • 2.04 kB
JavaScript
import { createEffect } from "@lincode/reactivity";
import { forceGet, splitFileName } from "@lincode/utils";
import dirPath from "../../../api/path/dirPath";
import isRelativePath from "../../../api/path/isRelativePath";
import joinPaths from "../../../api/path/joinPaths";
import { getFileCurrent } from "../../../states/useFileCurrent";
import { getFiles } from "../../../states/useFiles";
import setURLModifier from "../../utils/loaders/setURLModifier";
const objectURLExtensionMap = new Map();
const fileObjectURLMap = new Map();
export const objectURLFileMap = new Map();
export const getExtensionIncludingObjectURL = (src) => objectURLExtensionMap.get(src) ?? splitFileName(src)[1]?.toLowerCase();
export const createObjectURL = (file, extension = splitFileName(file.webkitRelativePath)[1]?.toLowerCase()) => forceGet(fileObjectURLMap, file, () => {
const url = URL.createObjectURL(file);
extension && objectURLExtensionMap.set(url, extension);
objectURLFileMap.set(url, file);
return url;
});
const pathFileMap = new Map();
createEffect(() => {
const files = getFiles();
if (!files)
return;
for (const file of files)
pathFileMap.set(file.webkitRelativePath, file);
return () => {
for (const objecURL of fileObjectURLMap.values())
URL.revokeObjectURL(objecURL);
pathFileMap.clear();
objectURLExtensionMap.clear();
fileObjectURLMap.clear();
objectURLFileMap.clear();
};
}, [getFiles]);
createEffect(() => {
const urlCurrent = getFileCurrent()?.webkitRelativePath;
if (!urlCurrent)
return;
setURLModifier((url) => {
if (isRelativePath(url)) {
const file = pathFileMap.get(joinPaths(dirPath(urlCurrent), url));
if (file)
return createObjectURL(file);
}
return url;
});
return () => {
setURLModifier(undefined);
};
}, [getFileCurrent]);
//# sourceMappingURL=objectURL.js.map