Files
medical-mall/utils/authRedirect.uts

63 lines
1.8 KiB
Plaintext

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<string, any>
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)}`
})
}