From 7b25f2afbc638a4affe8b2117d5d41a481c74c98 Mon Sep 17 00:00:00 2001 From: neoapps-dev Date: Sun, 12 Apr 2026 15:48:55 +0300 Subject: [PATCH] fix: skin sync for neoLegacy --- src/hooks/useSkinSync.ts | 55 ++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/src/hooks/useSkinSync.ts b/src/hooks/useSkinSync.ts index 1344954..0f5dfad 100644 --- a/src/hooks/useSkinSync.ts +++ b/src/hooks/useSkinSync.ts @@ -12,37 +12,42 @@ interface UseSkinSyncProps { } export function useSkinSync({ profile, editions }: UseSkinSyncProps) { - const [skinUrl, setSkinUrl] = useLocalStorage("lce-skin", "/images/Default.png"); + const [skinUrl, setSkinUrl] = useLocalStorage( + "lce-skin", + "/images/Default.png", + ); const [skinBase64, setSkinBase64] = useState(null); useEffect(() => { - const syncSkin = async () => { - if (!skinUrl) return; - const edition = editions.find((e) => e.id === profile); - const supportsSlim = edition?.supportsSlimSkins ?? false; - if (!supportsSlim) { - try { - const img = new Image(); - img.crossOrigin = "anonymous"; - img.onload = () => { - const cvs = document.createElement("canvas"); - cvs.width = 64; - cvs.height = 32; - const ctx = cvs.getContext("2d"); - if (ctx) { - ctx.drawImage(img, 0, 0, 64, 32, 0, 0, 64, 32); - setSkinBase64(cvs.toDataURL("image/png")); - } - }; - img.src = skinUrl; - } catch (e) { - console.error("Skin conversion failed:", e); - } + let cancelled = false; + if (!skinUrl) return; + + const edition = editions.find((e) => e.id === profile); + const supportsSlim = edition?.supportsSlimSkins ?? false; + + const img = new Image(); + img.crossOrigin = "anonymous"; + img.onload = () => { + if (cancelled) return; + const cvs = document.createElement("canvas"); + if (supportsSlim) { + cvs.width = img.width; + cvs.height = img.height; } else { - setSkinBase64(null); + cvs.width = 64; + cvs.height = 32; + } + const ctx = cvs.getContext("2d"); + if (ctx) { + ctx.drawImage(img, 0, 0); + setSkinBase64(cvs.toDataURL("image/png")); } }; - syncSkin(); + img.src = skinUrl; + + return () => { + cancelled = true; + }; }, [skinUrl, profile, editions]); return {