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