publish-guard.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { get } from '@/core/http/http-client'
  2. import { buildRestPath } from '@/core/config/api-paths'
  3. import { fetchRealnameStatus } from '@/features/account/realname-gateway'
  4. import {
  5. normalizeRealnameFlag,
  6. shouldOpenRealnameDetail,
  7. REALNAME_NONE
  8. } from '@/features/mine-panel/realname-bridge'
  9. const ROUTE_CHECK = buildRestPath('user/checkIsCanPush')
  10. function unwrapPushBody(data, raw) {
  11. const candidates = [data, raw?.data, raw?.res?.data]
  12. for (const c of candidates) {
  13. if (!c || typeof c !== 'object') continue
  14. if (c.is_can_pass != null || c.no_pass_error != null) return c
  15. if (c.data && typeof c.data === 'object') {
  16. const inner = c.data
  17. if (inner.is_can_pass != null || inner.no_pass_error != null) return inner
  18. }
  19. }
  20. return data && typeof data === 'object' ? data : {}
  21. }
  22. function normalizePerm(body) {
  23. return {
  24. isCanPass: Number(body.is_can_pass),
  25. errorMessage: String(body.no_pass_error || '').trim()
  26. }
  27. }
  28. /** is_can_pass: 0 可发布,1 需实名认证 */
  29. export async function fetchPushPermission() {
  30. const { data, raw } = await get(ROUTE_CHECK)
  31. return normalizePerm(unwrapPushBody(data, raw))
  32. }
  33. export function canPublishContent(isCanPass) {
  34. return Number(isCanPass) === 0
  35. }
  36. export async function navigateToRealnameVerify() {
  37. try {
  38. const r = await fetchRealnameStatus()
  39. if (!r.ok) {
  40. uni.navigateTo({ url: '/pages/account/realname-add' })
  41. return
  42. }
  43. const flag = normalizeRealnameFlag(r.is_real)
  44. if (flag === REALNAME_NONE) {
  45. uni.navigateTo({ url: '/pages/account/realname-add' })
  46. return
  47. }
  48. if (shouldOpenRealnameDetail(flag)) {
  49. uni.navigateTo({ url: '/pages/account/realname-info' })
  50. return
  51. }
  52. uni.navigateTo({ url: '/pages/account/realname-add' })
  53. } catch (_) {
  54. uni.navigateTo({ url: '/pages/account/realname-add' })
  55. }
  56. }
  57. export function showPushBlockedModal(vm, perm) {
  58. const t = vm && vm.$t ? vm.$t.bind(vm) : (k) => k
  59. const content = perm.errorMessage || t('user.publishNeedRealname')
  60. return new Promise((resolve) => {
  61. uni.showModal({
  62. content,
  63. showCancel: true,
  64. cancelText: t('user.realnameModalCancel'),
  65. confirmText: t('user.publishGoVerify'),
  66. success: (res) => {
  67. if (res.confirm) navigateToRealnameVerify()
  68. resolve(false)
  69. },
  70. fail: () => resolve(false)
  71. })
  72. })
  73. }
  74. /**
  75. * 进入发布页时检测:有权限不打扰,无权限弹窗提示。
  76. */
  77. export async function checkPushPermissionOnEnter(vm) {
  78. const t = vm && vm.$t ? vm.$t.bind(vm) : (k) => k
  79. try {
  80. const perm = await fetchPushPermission()
  81. if (canPublishContent(perm.isCanPass)) return true
  82. await showPushBlockedModal(vm, perm)
  83. return false
  84. } catch (err) {
  85. if (vm && vm.$appKit && vm.$appKit.msg) {
  86. vm.$appKit.msg((err && err.message) || t('user.realnameNetworkError'))
  87. }
  88. return false
  89. }
  90. }