修复小程序推荐页系统分享直达作品

同步推荐页当前作品到小程序原生分享目标
保留小程序系统分享路径中的公开作品参数
补充小程序分享目标解析与前端消息发送测试
This commit is contained in:
kdletters
2026-06-11 22:30:23 +08:00
parent c5763fdf25
commit d78c11d5b7
6 changed files with 299 additions and 7 deletions

View File

@@ -0,0 +1,67 @@
/* @vitest-environment jsdom */
import { afterEach, describe, expect, test, vi } from 'vitest';
import {
buildWechatMiniProgramShareTargetMessage,
postWechatMiniProgramShareTarget,
} from './wechatMiniProgramShareTarget';
afterEach(() => {
vi.restoreAllMocks();
Reflect.deleteProperty(window, 'wx');
window.history.replaceState(null, '', '/');
});
describe('wechatMiniProgramShareTarget', () => {
test('builds a compact share target message for mini program native share', () => {
expect(
buildWechatMiniProgramShareTargetMessage({
targetPath: '/works/detail',
work: ' BB-12345678 ',
title: ' 汪汪声浪 ',
}),
).toEqual({
type: 'genarrative:share-target',
payload: {
targetPath: '/works/detail',
work: 'BB-12345678',
title: '汪汪声浪',
},
});
});
test('posts the current recommended work to mini program web-view host', () => {
const postMessage = vi.fn();
window.history.replaceState(
null,
'',
'/?clientRuntime=wechat_mini_program',
);
window.wx = {
miniProgram: {
postMessage,
},
};
expect(
postWechatMiniProgramShareTarget({
targetPath: '/works/detail',
work: 'BB-12345678',
title: '汪汪声浪',
}),
).toBe(true);
expect(postMessage).toHaveBeenCalledWith({
data: {
type: 'genarrative:share-target',
payload: {
targetPath: '/works/detail',
work: 'BB-12345678',
title: '汪汪声浪',
},
},
});
});
});

View File

@@ -0,0 +1,61 @@
import { isWechatMiniProgramWebViewRuntime } from './authService';
const MESSAGE_TYPE = 'genarrative:share-target';
export type WechatMiniProgramShareTarget = {
targetPath: '/works/detail';
work: string;
title?: string | null;
};
function normalizeShareTarget(
target: WechatMiniProgramShareTarget | null | undefined,
) {
const work = target?.work?.trim() ?? '';
if (!work) {
return null;
}
return {
targetPath: '/works/detail' as const,
work,
title: target?.title?.trim() || undefined,
};
}
export function buildWechatMiniProgramShareTargetMessage(
target: WechatMiniProgramShareTarget | null | undefined,
) {
const normalizedTarget = normalizeShareTarget(target);
return normalizedTarget
? {
type: MESSAGE_TYPE,
payload: normalizedTarget,
}
: null;
}
export function postWechatMiniProgramShareTarget(
target: WechatMiniProgramShareTarget | null | undefined,
) {
if (
typeof window === 'undefined' ||
!isWechatMiniProgramWebViewRuntime() ||
typeof window.wx?.miniProgram?.postMessage !== 'function'
) {
return false;
}
const message = buildWechatMiniProgramShareTargetMessage(target);
if (!message) {
return false;
}
// 中文注释:微信 web-view 会在分享等时机把 postMessage 数据交给原生页,
// 小程序页据此把右上角系统分享指向当前推荐作品。
window.wx.miniProgram.postMessage({
data: message,
});
return true;
}