56 lines
1.7 KiB
TypeScript
56 lines
1.7 KiB
TypeScript
import type { YinianSessionState } from '../../../shared/yinian';
|
|
|
|
const DEFAULT_PRODUCT_CENTER_URL = 'https://ticket.nianxx.cn/';
|
|
|
|
export interface ProductCenterLaunchOptions {
|
|
baseUrl?: string;
|
|
reloadKey: number;
|
|
session: YinianSessionState;
|
|
// Future SSO should use a short-lived one-time ticket, never a long-lived desktop credential.
|
|
ssoToken?: string;
|
|
}
|
|
|
|
export function getProductCenterBaseUrl() {
|
|
return import.meta.env.VITE_PRODUCT_CENTER_URL?.trim() || DEFAULT_PRODUCT_CENTER_URL;
|
|
}
|
|
|
|
export function buildProductCenterSrc(options: ProductCenterLaunchOptions) {
|
|
const baseUrl = options.baseUrl?.trim() || DEFAULT_PRODUCT_CENTER_URL;
|
|
|
|
try {
|
|
const url = new URL(baseUrl);
|
|
url.searchParams.set('zhinianEmbed', '1');
|
|
url.searchParams.set('zhinianApp', 'product-center');
|
|
url.searchParams.set('zhinianHostReload', String(options.reloadKey));
|
|
|
|
if (options.session.authenticated) {
|
|
url.searchParams.set('workspaceId', options.session.currentHotelId);
|
|
url.searchParams.set('userId', options.session.user.id);
|
|
}
|
|
|
|
if (options.ssoToken) {
|
|
url.searchParams.set('ssoToken', options.ssoToken);
|
|
}
|
|
|
|
return url.toString();
|
|
} catch {
|
|
const normalizedBase = baseUrl.replace(/\/$/, '');
|
|
const params = new URLSearchParams({
|
|
zhinianEmbed: '1',
|
|
zhinianApp: 'product-center',
|
|
zhinianHostReload: String(options.reloadKey),
|
|
});
|
|
|
|
if (options.session.authenticated) {
|
|
params.set('workspaceId', options.session.currentHotelId);
|
|
params.set('userId', options.session.user.id);
|
|
}
|
|
|
|
if (options.ssoToken) {
|
|
params.set('ssoToken', options.ssoToken);
|
|
}
|
|
|
|
return `${normalizedBase}/?${params.toString()}`;
|
|
}
|
|
}
|