fix: 分享卡片走兜底图优化
This commit is contained in:
@@ -133,11 +133,8 @@ export default forwardRef(({ id, from, detail, userInfo }, ref) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
useShareAppMessage(async (res) => {
|
useShareAppMessage(async () => {
|
||||||
await changeMessageType();
|
const url = shareImageUrl || (await generateShareImageUrl());
|
||||||
await ensureUserInfo();
|
|
||||||
const url = await generateShareImageUrl();
|
|
||||||
// console.log(res, "res");
|
|
||||||
return {
|
return {
|
||||||
title: detail.title,
|
title: detail.title,
|
||||||
imageUrl: url,
|
imageUrl: url,
|
||||||
|
|||||||
@@ -115,16 +115,25 @@ function with_cache_bust(url: string): string {
|
|||||||
// 工具函数 - OffscreenCanvas 下加载图片(使用 offscreen.createImage)
|
// 工具函数 - OffscreenCanvas 下加载图片(使用 offscreen.createImage)
|
||||||
const loadImage = (src: string): Promise<any> => {
|
const loadImage = (src: string): Promise<any> => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
let timer: ReturnType<typeof setTimeout> | null = null
|
||||||
try {
|
try {
|
||||||
const off = runtime.offscreen
|
const off = runtime.offscreen
|
||||||
if (!off || typeof off.createImage !== 'function') {
|
if (!off || typeof off.createImage !== 'function') {
|
||||||
throw new Error('OffscreenCanvas 未初始化或不支持 createImage')
|
throw new Error('OffscreenCanvas 未初始化或不支持 createImage')
|
||||||
}
|
}
|
||||||
const img = off.createImage()
|
const img = off.createImage()
|
||||||
img.onload = () => resolve(img)
|
timer = setTimeout(() => reject(new Error(`图片加载超时: ${src}`)), 8000)
|
||||||
img.onerror = reject
|
img.onload = () => {
|
||||||
|
if (timer) clearTimeout(timer)
|
||||||
|
resolve(img)
|
||||||
|
}
|
||||||
|
img.onerror = (e: any) => {
|
||||||
|
if (timer) clearTimeout(timer)
|
||||||
|
reject(e)
|
||||||
|
}
|
||||||
img.src = with_cache_bust(src)
|
img.src = with_cache_bust(src)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
if (timer) clearTimeout(timer)
|
||||||
reject(e)
|
reject(e)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -413,7 +422,7 @@ const drawShareCard = async (ctx: any, data: ShareCardData, offscreen: any): Pro
|
|||||||
ctx.restore()
|
ctx.restore()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// 如果头像加载失败,绘制默认头像
|
// 如果头像加载失败,绘制默认头像
|
||||||
ctx.setFillStyle('#CCCCCC')
|
ctx.fillStyle = '#CCCCCC'
|
||||||
ctx.beginPath()
|
ctx.beginPath()
|
||||||
ctx.arc(avatarX + avatarSize / 2, avatarY + avatarSize / 2, avatarSize / 2, 0, 2 * Math.PI)
|
ctx.arc(avatarX + avatarSize / 2, avatarY + avatarSize / 2, avatarSize / 2, 0, 2 * Math.PI)
|
||||||
ctx.fill()
|
ctx.fill()
|
||||||
@@ -594,10 +603,12 @@ export async function generateShareImage(data: ShareCardData): Promise<string> {
|
|||||||
// 记录到 runtime(供 loadImage 使用)
|
// 记录到 runtime(供 loadImage 使用)
|
||||||
runtime.offscreen = offscreen
|
runtime.offscreen = offscreen
|
||||||
isDrawing = true
|
isDrawing = true
|
||||||
|
try {
|
||||||
const imagePath = await drawShareCard(ctx, data, offscreen)
|
const imagePath = await drawShareCard(ctx, data, offscreen)
|
||||||
isDrawing = false
|
|
||||||
return imagePath
|
return imagePath
|
||||||
|
} finally {
|
||||||
|
isDrawing = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default generateShareImage
|
export default generateShareImage
|
||||||
|
|||||||
Reference in New Issue
Block a user