91 lines
3.0 KiB
TypeScript
91 lines
3.0 KiB
TypeScript
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<ClientRuntimeConfig> {
|
|
return request<ClientRuntimeConfig>('PARTNER_H5', '/common/client-config');
|
|
}
|
|
|
|
export async function fetchPartnerProfile(): Promise<PartnerProfile> {
|
|
return request<PartnerProfile>('PARTNER_H5', '/partner/me');
|
|
}
|
|
|
|
/** 微信内上传照片前需完成公众号授权绑定 */
|
|
export function needsWechatAuth(
|
|
profile: PartnerProfile | null,
|
|
config?: Pick<ClientRuntimeConfig, 'wxAuthorize'> | null,
|
|
): boolean {
|
|
if (config && !isWxAuthorizeEnabled(config)) return false;
|
|
return isWechatEnv() && !!profile && !profile.hasWechat;
|
|
}
|
|
|
|
export async function checkNeedsWechatAuth(profile: PartnerProfile | null): Promise<boolean> {
|
|
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<void> {
|
|
try {
|
|
const profile = await fetchPartnerProfile();
|
|
saveAuth({
|
|
accessToken: localStorage.getItem('accessToken') ?? '',
|
|
partner: profile,
|
|
});
|
|
} catch {
|
|
/* ignore */
|
|
}
|
|
}
|
|
|
|
export async function handlePartnerWechatCallback(): Promise<WechatLoginResult | null> {
|
|
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<boolean | void> {
|
|
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<WechatLoginResult | void> {
|
|
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);
|
|
}
|