Files
NianToB/src/pages/ProductCenter/url.ts

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()}`;
}
}