import type { ClientRuntimeConfig, WechatLoginResult } from '@dukang/shared-types'; import { isWxAuthorizeEnabled } from '@dukang/shared-types'; import { WECHAT_INAPP_REQUIRED_MSG } from '@dukang/weixin-sdk'; import { isWechatEnv, weixinSdk } from './weixin'; import { request, saveAuth } from './api'; export type PartnerProfile = { id: string; name: string; phone: string; companyName: string; hasWechat?: boolean; }; export async function fetchClientConfig(): Promise { return request('PARTNER_H5', '/common/client-config'); } export async function fetchPartnerProfile(): Promise { return request('PARTNER_H5', '/partner/me'); } /** 微信内上传照片前需完成公众号授权绑定 */ export function needsWechatAuth( profile: PartnerProfile | null, config?: Pick | null, ): boolean { if (config && !isWxAuthorizeEnabled(config)) return false; return isWechatEnv() && !!profile && !profile.hasWechat; } export async function checkNeedsWechatAuth(profile: PartnerProfile | null): Promise { const config = await fetchClientConfig(); return needsWechatAuth(profile, config); } /** 处理微信登录/绑定结果,返回是否已拿到 token 可进入首页 */ export function handlePartnerWechatLoginResult(result: WechatLoginResult): boolean { if (!result.accessToken) return false; saveAuth({ accessToken: result.accessToken }); return true; } /** 微信登录成功后拉取并缓存合伙人资料,供一键登录页展示 */ export async function persistPartnerProfileAfterLogin(): Promise { try { const profile = await fetchPartnerProfile(); saveAuth({ accessToken: localStorage.getItem('accessToken') ?? '', partner: profile, }); } catch { /* ignore */ } } export async function handlePartnerWechatCallback(): Promise { if (!isWechatEnv()) return null; const config = await fetchClientConfig(); if (!isWxAuthorizeEnabled(config)) return null; return weixinSdk.handleOAuthCallback(); } /** * 微信授权登录(对齐 C 端:仅微信内置浏览器走 OAuth)。 * 返回 true = 已登录;void = 已跳转授权页等待回调。 */ export async function loginPartnerWithWechat(): Promise { const config = await fetchClientConfig(); if (!isWxAuthorizeEnabled(config)) return false; if (!isWechatEnv()) { throw new Error(WECHAT_INAPP_REQUIRED_MSG); } const result = await weixinSdk.login(); if (result) return handlePartnerWechatLoginResult(result); } export async function authorizePartnerWechat(): Promise { const config = await fetchClientConfig(); if (!isWxAuthorizeEnabled(config)) return; if (!isWechatEnv()) { throw new Error(WECHAT_INAPP_REQUIRED_MSG); } return weixinSdk.login(); } /** @deprecated 使用 handlePartnerWechatLoginResult */ export function savePartnerWechatAuth(result: WechatLoginResult): boolean { return handlePartnerWechatLoginResult(result); }