deep-link-router.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. const TAB_ROOTS = ['pages/index/index', 'pages/feed/index', 'pages/live/hall', 'pages/dynamics/index', 'pages/mine/index']
  2. function extractCustomUrl(payload) {
  3. if (!payload || typeof payload !== 'object') return ''
  4. const pick = (obj) => {
  5. const bag = obj.custom_data || obj.customData
  6. if (!bag || typeof bag !== 'object') return ''
  7. const target = bag.url || bag.path || bag.page
  8. return typeof target === 'string' ? target.trim() : ''
  9. }
  10. return pick(payload.data) || pick(payload)
  11. }
  12. export function openPushTarget(payload, prefs) {
  13. if (!prefs?.pushs) return
  14. const raw = extractCustomUrl(payload)
  15. if (!raw) return
  16. const full = raw.startsWith('/') ? raw : `/${raw}`
  17. const qPos = full.indexOf('?')
  18. const pathOnly = qPos >= 0 ? full.slice(0, qPos) : full
  19. const query = qPos >= 0 ? full.slice(qPos + 1) : ''
  20. const normalized = pathOnly.replace(/^\//, '')
  21. const isTab = TAB_ROOTS.includes(normalized)
  22. const navigate = () => {
  23. if (isTab) {
  24. uni.switchTab({
  25. url: pathOnly,
  26. fail: (e) => console.warn('[push-nav] switchTab fail', pathOnly, e)
  27. })
  28. return
  29. }
  30. const target = query ? `${pathOnly}?${query}` : full
  31. uni.navigateTo({
  32. url: target,
  33. fail: () => uni.reLaunch({ url: target })
  34. })
  35. }
  36. setTimeout(navigate, 100)
  37. }