fix: fix upload bug 3d

This commit is contained in:
2025-10-20 20:00:28 +03:00
parent f5142ec95d
commit 1b8fc3d215
9 changed files with 722 additions and 9 deletions

View File

@@ -0,0 +1,98 @@
/**
* Утилита для управления кешем GLTF и blob URL
*/
// Динамический импорт useGLTF для избежания проблем с SSR
let useGLTF: any = null;
const initializeUseGLTF = async () => {
if (!useGLTF) {
try {
const drei = await import("@react-three/drei");
useGLTF = drei.useGLTF;
} catch (error) {
console.warn(
"⚠️ GLTFCacheManager: Не удалось импортировать useGLTF",
error
);
}
}
return useGLTF;
};
/**
* Очищает кеш GLTF для конкретного URL
*/
export const clearGLTFCacheForUrl = async (url: string) => {
try {
const gltf = await initializeUseGLTF();
if (gltf && gltf.clear) {
gltf.clear(url);
console.log("🧹 GLTFCacheManager: Очистка кеша для URL", { url });
}
} catch (error) {
console.warn("⚠️ GLTFCacheManager: Ошибка при очистке кеша для URL", error);
}
};
/**
* Очищает весь кеш GLTF
*/
export const clearAllGLTFCache = async () => {
try {
const gltf = await initializeUseGLTF();
if (gltf && gltf.clear) {
gltf.clear();
console.log("🧹 GLTFCacheManager: Очистка всего кеша GLTF");
}
} catch (error) {
console.warn("⚠️ GLTFCacheManager: Ошибка при очистке всего кеша", error);
}
};
/**
* Очищает blob URL из памяти браузера
*/
export const revokeBlobURL = (url: string) => {
if (url && url.startsWith("blob:")) {
try {
URL.revokeObjectURL(url);
console.log("🧹 GLTFCacheManager: Отзыв blob URL", { url });
} catch (error) {
console.warn("⚠️ GLTFCacheManager: Ошибка при отзыве blob URL", error);
}
}
};
/**
* Комплексная очистка: blob URL + кеш GLTF
*/
export const clearBlobAndGLTFCache = async (url: string) => {
// Сначала отзываем blob URL
revokeBlobURL(url);
// Затем очищаем кеш GLTF
await clearGLTFCacheForUrl(url);
console.log("🧹 GLTFCacheManager: Комплексная очистка выполнена", { url });
};
/**
* Очистка при смене медиа (для предотвращения конфликтов)
*/
export const clearMediaTransitionCache = async (
previousMediaId: string | number | null,
newMediaId: string | number | null,
newMediaType?: number
) => {
console.log("🔄 GLTFCacheManager: Очистка кеша при смене медиа", {
previousMediaId,
newMediaId,
newMediaType,
});
// Если переключаемся с/на 3D модель, очищаем весь кеш
if (newMediaType === 6 || previousMediaId) {
await clearAllGLTFCache();
}
};