fix(mini-user): address textarea freeze, input align, wechat share invoke
CI / verify (pull_request) Has been cancelled
CI / verify (pull_request) Has been cancelled
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -26,6 +26,8 @@ export {
|
||||
setWechatShareData,
|
||||
canUseWechatShare,
|
||||
getWechatShareLink,
|
||||
shareViaWechatSdk,
|
||||
tryInvokeSharePanel,
|
||||
} from './share';
|
||||
export type { WechatShareData } from './share';
|
||||
export {
|
||||
@@ -48,7 +50,7 @@ import { getWechatLocation, getWechatLocationDetailed } from './location';
|
||||
import { scanQrCode } from './scan';
|
||||
import { invokeWechatPay } from './pay';
|
||||
import { chooseWechatImages } from './chooseImage';
|
||||
import { setWechatShareData } from './share';
|
||||
import { setWechatShareData, shareViaWechatSdk } from './share';
|
||||
import {
|
||||
wechatLogin,
|
||||
handleWechatOAuthCallback,
|
||||
@@ -79,5 +81,6 @@ export function createWeixinSdk(config: WeixinSdkConfig) {
|
||||
}),
|
||||
setShare: (data: Parameters<typeof setWechatShareData>[1]) =>
|
||||
setWechatShareData(config, data),
|
||||
share: (data: Parameters<typeof shareViaWechatSdk>[1]) => shareViaWechatSdk(config, data),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -15,13 +15,24 @@ export function canUseWechatShare(): boolean {
|
||||
|
||||
function applyShareData(data: WechatShareData): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const wx = window.wx;
|
||||
if (!wx?.updateAppMessageShareData || !wx.updateTimelineShareData) {
|
||||
reject(new Error('当前微信版本不支持分享,请升级微信后重试'));
|
||||
const wx = window.wx as
|
||||
| (NonNullable<typeof window.wx> & {
|
||||
onMenuShareAppMessage?: (opts: Record<string, unknown>) => void;
|
||||
onMenuShareTimeline?: (opts: Record<string, unknown>) => void;
|
||||
invoke?: (
|
||||
api: string,
|
||||
params: Record<string, unknown>,
|
||||
cb?: (res: { err_msg?: string; errMsg?: string }) => void,
|
||||
) => void;
|
||||
})
|
||||
| undefined;
|
||||
|
||||
if (!wx) {
|
||||
reject(new Error('微信 JSSDK 不可用'));
|
||||
return;
|
||||
}
|
||||
|
||||
let pending = 2;
|
||||
let pending = 0;
|
||||
let failed = false;
|
||||
const done = (err?: Error) => {
|
||||
if (err && !failed) {
|
||||
@@ -33,22 +44,95 @@ function applyShareData(data: WechatShareData): Promise<void> {
|
||||
if (pending === 0 && !failed) resolve();
|
||||
};
|
||||
|
||||
wx.updateAppMessageShareData({
|
||||
const payload = {
|
||||
title: data.title,
|
||||
desc: data.desc,
|
||||
link: data.link,
|
||||
imgUrl: data.imgUrl,
|
||||
success: () => done(),
|
||||
fail: (res) => done(new Error(res.errMsg || '设置分享给朋友失败')),
|
||||
});
|
||||
};
|
||||
|
||||
wx.updateTimelineShareData({
|
||||
title: data.title,
|
||||
link: data.link,
|
||||
imgUrl: data.imgUrl,
|
||||
success: () => done(),
|
||||
fail: (res) => done(new Error(res.errMsg || '设置分享到朋友圈失败')),
|
||||
});
|
||||
if (wx.updateAppMessageShareData) {
|
||||
pending += 1;
|
||||
wx.updateAppMessageShareData({
|
||||
...payload,
|
||||
success: () => done(),
|
||||
fail: (res) => done(new Error(res.errMsg || '设置分享给朋友失败')),
|
||||
});
|
||||
}
|
||||
|
||||
if (wx.updateTimelineShareData) {
|
||||
pending += 1;
|
||||
wx.updateTimelineShareData({
|
||||
title: data.title,
|
||||
link: data.link,
|
||||
imgUrl: data.imgUrl,
|
||||
success: () => done(),
|
||||
fail: (res) => done(new Error(res.errMsg || '设置分享到朋友圈失败')),
|
||||
});
|
||||
}
|
||||
|
||||
// 兼容旧微信:同时挂旧版菜单分享(设置即生效,无 success 回调也可继续)
|
||||
if (wx.onMenuShareAppMessage) {
|
||||
wx.onMenuShareAppMessage({
|
||||
...payload,
|
||||
success: () => {},
|
||||
cancel: () => {},
|
||||
});
|
||||
}
|
||||
if (wx.onMenuShareTimeline) {
|
||||
wx.onMenuShareTimeline({
|
||||
title: data.title,
|
||||
link: data.link,
|
||||
imgUrl: data.imgUrl,
|
||||
success: () => {},
|
||||
cancel: () => {},
|
||||
});
|
||||
}
|
||||
|
||||
if (pending === 0) {
|
||||
if (wx.onMenuShareAppMessage || wx.onMenuShareTimeline) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
reject(new Error('当前微信版本不支持分享,请升级微信后重试'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/** 尽量调起系统分享面板(部分微信版本支持;失败则仅完成卡片配置) */
|
||||
export function tryInvokeSharePanel(data: WechatShareData): Promise<boolean> {
|
||||
return new Promise((resolve) => {
|
||||
const wx = window.wx as
|
||||
| {
|
||||
invoke?: (
|
||||
api: string,
|
||||
params: Record<string, unknown>,
|
||||
cb?: (res: { err_msg?: string; errMsg?: string }) => void,
|
||||
) => void;
|
||||
}
|
||||
| undefined;
|
||||
if (!wx?.invoke) {
|
||||
resolve(false);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
wx.invoke(
|
||||
'shareAppMessage',
|
||||
{
|
||||
title: data.title,
|
||||
desc: data.desc,
|
||||
link: data.link,
|
||||
img_url: data.imgUrl,
|
||||
imgUrl: data.imgUrl,
|
||||
},
|
||||
(res) => {
|
||||
const msg = `${res?.err_msg || res?.errMsg || ''}`;
|
||||
resolve(/:ok\b/i.test(msg));
|
||||
},
|
||||
);
|
||||
} catch {
|
||||
resolve(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -68,6 +152,19 @@ export async function setWechatShareData(
|
||||
await applyShareData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置分享并尝试调起分享面板。
|
||||
* @returns invoked=true 表示已弹出系统分享;否则需引导用户点右上角
|
||||
*/
|
||||
export async function shareViaWechatSdk(
|
||||
config: WeixinSdkConfig,
|
||||
data: WechatShareData,
|
||||
): Promise<{ invoked: boolean }> {
|
||||
await setWechatShareData(config, data);
|
||||
const invoked = await tryInvokeSharePanel(data);
|
||||
return { invoked };
|
||||
}
|
||||
|
||||
/** 获取当前页分享链接(去掉 hash、OAuth 回跳参数) */
|
||||
export function getWechatShareLink(rawUrl?: string): string {
|
||||
if (typeof window === 'undefined') return rawUrl ?? '';
|
||||
|
||||
@@ -122,4 +122,6 @@ export const DEFAULT_JS_API_LIST = [
|
||||
'getLocalImgData',
|
||||
'updateAppMessageShareData',
|
||||
'updateTimelineShareData',
|
||||
'onMenuShareAppMessage',
|
||||
'onMenuShareTimeline',
|
||||
] as const;
|
||||
|
||||
Reference in New Issue
Block a user