export type AuthRedirectOptions = { loginPath?: string registerPath?: string fallbackUrl?: string } function normalizePath(path: string): string { if (!path) return '' return path.startsWith('/') ? path : `/${path}` } function safeEncode(url: string): string { try { return encodeURIComponent(url) } catch (_) { return url } } export function getCurrentPageUrlWithQuery(): string { const pages = getCurrentPages() as any[] const currentPage = pages.length > 0 ? pages[pages.length - 1] : null if (!currentPage) return '' const route = currentPage.route as string | null const options = (currentPage.options ?? {}) as Record if (!route) return '' const path = normalizePath(route) const keys = Object.keys(options) if (keys.length === 0) return path const query = keys .filter((k) => options[k] != null) .map((k) => `${k}=${encodeURIComponent(String(options[k]))}`) .join('&') return query.length > 0 ? `${path}?${query}` : path } export function toLoginWithRedirect(redirectUrl?: string, opts?: AuthRedirectOptions) { const loginPath = opts?.loginPath ?? '/pages/user/login' const fallback = opts?.fallbackUrl ?? '/pages/mall/consumer/index' const target = (redirectUrl != null && redirectUrl.length > 0) ? redirectUrl : (getCurrentPageUrlWithQuery() || fallback) uni.navigateTo({ url: `${loginPath}?redirect=${safeEncode(target)}` }) } export function toRegisterWithRedirect(redirectUrl?: string, opts?: AuthRedirectOptions) { const registerPath = opts?.registerPath ?? '/pages/user/register' const fallback = opts?.fallbackUrl ?? '/pages/mall/consumer/index' const target = (redirectUrl != null && redirectUrl.length > 0) ? redirectUrl : (getCurrentPageUrlWithQuery() || fallback) uni.navigateTo({ url: `${registerPath}?redirect=${safeEncode(target)}` }) }