import { isWechatMiniProgramWebViewRuntime } from './authService'; const WECHAT_JS_SDK_URL = 'https://res.wx.qq.com/open/js/jweixin-1.6.0.js'; const SHARE_GRID_PAGE_URL = '/pages/share-grid/index'; function loadWechatMiniProgramBridge() { if ( typeof window === 'undefined' || !isWechatMiniProgramWebViewRuntime() ) { return Promise.reject(new Error('not_mini_program')); } if (window.wx?.miniProgram?.navigateTo) { return Promise.resolve(window.wx); } return new Promise>((resolve, reject) => { const existingScript = document.querySelector( `script[src="${WECHAT_JS_SDK_URL}"]`, ); const complete = () => { if (window.wx?.miniProgram?.navigateTo) { resolve(window.wx); } else { reject(new Error('wechat_js_sdk_unavailable')); } }; if (existingScript) { existingScript.addEventListener('load', complete, { once: true }); existingScript.addEventListener( 'error', () => reject(new Error('wechat_js_sdk_load_failed')), { once: true }, ); complete(); return; } const script = document.createElement('script'); script.src = WECHAT_JS_SDK_URL; script.async = true; script.onload = complete; script.onerror = () => reject(new Error('wechat_js_sdk_load_failed')); document.head.appendChild(script); }); } function buildAbsoluteUrl(value: string) { if (typeof window === 'undefined') { return value; } return new URL(value, window.location.origin).href; } export function canUseWechatMiniProgramShareGrid() { return isWechatMiniProgramWebViewRuntime(); } export async function openWechatMiniProgramShareGridPage(params: { imageUrl: string; title: string; publicWorkCode: string; }) { const imageUrl = params.imageUrl.trim(); if (!imageUrl) { return false; } const wxBridge = await loadWechatMiniProgramBridge(); const miniProgram = wxBridge.miniProgram; if (!miniProgram?.navigateTo) { return false; } const searchParams = new URLSearchParams({ imageUrl: buildAbsoluteUrl(imageUrl), title: params.title.trim() || '我的作品', publicWorkCode: params.publicWorkCode.trim(), }); const url = `${SHARE_GRID_PAGE_URL}?${searchParams.toString()}`; return await new Promise((resolve) => { miniProgram.navigateTo?.({ url, success() { resolve(true); }, fail() { resolve(false); }, }); }); }