From 4965d6c40eec3019af1678ac09a068d9b3308e72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=9D=B0?= Date: Thu, 9 Apr 2026 14:58:02 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=88=86=E4=BA=AB=E5=8D=A1=E7=89=87?= =?UTF-8?q?=E8=B5=B0=E5=85=9C=E5=BA=95=E5=9B=BE=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/components/SharePopup/index.tsx | 7 ++---- src/utils/share.ts | 25 +++++++++++++------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/game_pages/detail/components/SharePopup/index.tsx b/src/game_pages/detail/components/SharePopup/index.tsx index 31fbbdf..27ba662 100644 --- a/src/game_pages/detail/components/SharePopup/index.tsx +++ b/src/game_pages/detail/components/SharePopup/index.tsx @@ -133,11 +133,8 @@ export default forwardRef(({ id, from, detail, userInfo }, ref) => { } } - useShareAppMessage(async (res) => { - await changeMessageType(); - await ensureUserInfo(); - const url = await generateShareImageUrl(); - // console.log(res, "res"); + useShareAppMessage(async () => { + const url = shareImageUrl || (await generateShareImageUrl()); return { title: detail.title, imageUrl: url, diff --git a/src/utils/share.ts b/src/utils/share.ts index bf4cbaf..0f6f4f8 100644 --- a/src/utils/share.ts +++ b/src/utils/share.ts @@ -115,16 +115,25 @@ function with_cache_bust(url: string): string { // 工具函数 - OffscreenCanvas 下加载图片(使用 offscreen.createImage) const loadImage = (src: string): Promise => { return new Promise((resolve, reject) => { + let timer: ReturnType | null = null try { const off = runtime.offscreen if (!off || typeof off.createImage !== 'function') { throw new Error('OffscreenCanvas 未初始化或不支持 createImage') } const img = off.createImage() - img.onload = () => resolve(img) - img.onerror = reject + timer = setTimeout(() => reject(new Error(`图片加载超时: ${src}`)), 8000) + img.onload = () => { + if (timer) clearTimeout(timer) + resolve(img) + } + img.onerror = (e: any) => { + if (timer) clearTimeout(timer) + reject(e) + } img.src = with_cache_bust(src) } catch (e) { + if (timer) clearTimeout(timer) reject(e) } }) @@ -413,7 +422,7 @@ const drawShareCard = async (ctx: any, data: ShareCardData, offscreen: any): Pro ctx.restore() } catch (error) { // 如果头像加载失败,绘制默认头像 - ctx.setFillStyle('#CCCCCC') + ctx.fillStyle = '#CCCCCC' ctx.beginPath() ctx.arc(avatarX + avatarSize / 2, avatarY + avatarSize / 2, avatarSize / 2, 0, 2 * Math.PI) ctx.fill() @@ -594,10 +603,12 @@ export async function generateShareImage(data: ShareCardData): Promise { // 记录到 runtime(供 loadImage 使用) runtime.offscreen = offscreen isDrawing = true - - const imagePath = await drawShareCard(ctx, data, offscreen) - isDrawing = false - return imagePath + try { + const imagePath = await drawShareCard(ctx, data, offscreen) + return imagePath + } finally { + isDrawing = false + } } export default generateShareImage