From d3390d5e8190119c4fba5eef0edeba2760add813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=9D=B0?= Date: Wed, 11 Mar 2026 11:48:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20debug=20=E5=88=86=E4=BA=AB=E5=8D=A1?= =?UTF-8?q?=E7=89=87=E7=94=9F=E6=88=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/components/SharePopup/index.tsx | 54 +++++++++++++------ src/utils/share.ts | 8 ++- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/game_pages/detail/components/SharePopup/index.tsx b/src/game_pages/detail/components/SharePopup/index.tsx index a43261b..79abf66 100644 --- a/src/game_pages/detail/components/SharePopup/index.tsx +++ b/src/game_pages/detail/components/SharePopup/index.tsx @@ -28,6 +28,17 @@ export default forwardRef(({ id, from, detail, userInfo }, ref) => { const [shareImageUrl, setShareImageUrl] = useState(""); const { fetchUserInfo } = useUserActions(); + async function ensureUserInfo() { + if (userInfo?.avatar_url && userInfo?.nickname) { + return userInfo; + } + const fetchedUserInfo = await fetchUserInfo(); + return { + avatar_url: fetchedUserInfo?.avatar_url || userInfo?.avatar_url || "", + nickname: fetchedUserInfo?.nickname || userInfo?.nickname || "", + }; + } + const publishFlag = from === "publish"; // const posterRef = useRef(); const { max_participants, participant_count } = detail || {}; @@ -86,25 +97,34 @@ export default forwardRef(({ id, from, detail, userInfo }, ref) => { const endTime = dayjs(end_time); const dayofWeek = DayOfWeekMap.get(startTime.day()); const gameLength = `${endTime.diff(startTime, "hour")}小时`; - console.log(userInfo, "userInfo"); - const url = await generateShareImage({ - userAvatar: userInfo.avatar_url, - userNickname: userInfo.nickname, - gameType: play_type, - skillLevel: `NTRP ${genNTRPRequirementText( - skill_level_min, - skill_level_max, - )}`, - gameDate: `${startTime.format("M月D日")} (${dayofWeek})`, - gameTime: `${startTime.format("ah")}点 ${gameLength}`, - venueName: location_name, - venueImages: image_list ? image_list : [], - }); - return url; + const currentUserInfo = await ensureUserInfo(); + try { + const url = await generateShareImage({ + userAvatar: currentUserInfo.avatar_url, + userNickname: currentUserInfo.nickname, + gameType: play_type, + skillLevel: `NTRP ${genNTRPRequirementText( + skill_level_min, + skill_level_max, + )}`, + gameDate: `${startTime.format("M月D日")} (${dayofWeek})`, + gameTime: `${startTime.format("ah")}点 ${gameLength}`, + venueName: location_name, + venueImages: image_list ? image_list : [], + }); + if (!url) { + throw new Error("生成分享图片失败,URL 为空"); + } + return url; + } catch (e) { + console.error("生成分享卡片失败", e); + return `${OSS_BASE}/system/game_dou_di_tu.png`; + } } useShareAppMessage(async (res) => { await changeMessageType(); + await ensureUserInfo(); const url = await generateShareImageUrl(); // console.log(res, "res"); return { @@ -128,8 +148,8 @@ export default forwardRef(({ id, from, detail, userInfo }, ref) => { } = detail || {}; // 先等待静默登录完成 await waitForAuthInit(); - const userInfo = await fetchUserInfo(); - const { avatar_url, nickname } = userInfo; + const currentUserInfo = await ensureUserInfo(); + const { avatar_url, nickname } = currentUserInfo; const startTime = dayjs(start_time); const endTime = dayjs(end_time); const dayofWeek = DayOfWeekMap.get(startTime.day()); diff --git a/src/utils/share.ts b/src/utils/share.ts index c15629a..bf4cbaf 100644 --- a/src/utils/share.ts +++ b/src/utils/share.ts @@ -106,6 +106,12 @@ const drawLabel = (ctx: any, x: number, y: number, width: number, height: number ctx.restore() } +/** 给图片 URL 加随机参数,避免同一链接二次加载不触发 onload */ +function with_cache_bust(url: string): string { + const sep = url.includes('?') ? '&' : '?'; + return `${url}${sep}_t=${Date.now()}_${Math.random().toString(36).slice(2)}`; +} + // 工具函数 - OffscreenCanvas 下加载图片(使用 offscreen.createImage) const loadImage = (src: string): Promise => { return new Promise((resolve, reject) => { @@ -117,7 +123,7 @@ const loadImage = (src: string): Promise => { const img = off.createImage() img.onload = () => resolve(img) img.onerror = reject - img.src = src + img.src = with_cache_bust(src) } catch (e) { reject(e) }