wangfukang 2 weeks ago
parent
commit
b6240b7fb4
  1. 144
      utils/sharePath.js

144
utils/sharePath.js

@ -1,6 +1,136 @@
export function buildHomeSharePath(targetPath) {
if (!targetPath) return '/pages/index/index'
return '/pages/index/index?targetPath=' + encodeURIComponent(targetPath)
const INVITE_CONTEXT_KEY = 'inviteShareContext'
const INVITE_DEVICE_KEY = 'inviteDeviceId'
function isBlank(value) {
return value === undefined || value === null || String(value).trim() === ''
}
function readCurrentRegionId() {
try {
const area = uni.getStorageSync('area')
if (!area) return ''
const data = typeof area === 'string' ? JSON.parse(area) : area
return data && data.id ? String(data.id) : ''
} catch (e) {
return ''
}
}
function appendParam(query, key, value) {
if (isBlank(value)) return
query.push(key + '=' + encodeURIComponent(String(value)))
}
export function getInviteDeviceId() {
let deviceId = ''
try {
deviceId = uni.getStorageSync(INVITE_DEVICE_KEY) || ''
} catch (e) {}
if (deviceId) return deviceId
deviceId = 'dev_' + Date.now() + '_' + Math.random().toString(36).slice(2, 12)
try {
uni.setStorageSync(INVITE_DEVICE_KEY, deviceId)
} catch (e) {}
return deviceId
}
export function getCurrentInviteParams() {
return {
inviterId: uni.getStorageSync('id') || '',
regionId: readCurrentRegionId()
}
}
export function normalizeInviteParams(params) {
params = params || {}
const inviterId = params.inviterId || params.inviteUserId || ''
const regionId = params.regionId || params.inviteRegionId || ''
return {
inviterId: isBlank(inviterId) ? '' : String(inviterId),
regionId: isBlank(regionId) ? '' : String(regionId)
}
}
function resolveInviteParams(params, useCurrentFallback) {
const invite = normalizeInviteParams(params)
if ((!invite.inviterId || !invite.regionId) && useCurrentFallback) {
const current = getCurrentInviteParams()
if (!invite.inviterId) invite.inviterId = current.inviterId
if (!invite.regionId) invite.regionId = current.regionId
}
return invite
}
function appendInviteParams(query, params, useCurrentFallback) {
const invite = resolveInviteParams(params, useCurrentFallback)
appendParam(query, 'inviterId', invite.inviterId)
appendParam(query, 'regionId', invite.regionId)
}
export function rememberInviteParams(params) {
const invite = normalizeInviteParams(params)
if (!invite.inviterId || !invite.regionId) return invite
try {
uni.setStorageSync(INVITE_CONTEXT_KEY, invite)
} catch (e) {}
return invite
}
export function getStoredInviteParams() {
try {
const stored = uni.getStorageSync(INVITE_CONTEXT_KEY)
if (!stored) return { inviterId: '', regionId: '' }
return normalizeInviteParams(typeof stored === 'string' ? JSON.parse(stored) : stored)
} catch (e) {
return { inviterId: '', regionId: '' }
}
}
export function parseQueryString(queryString) {
const result = {}
String(queryString || '').split('&').forEach((item) => {
if (!item) return
const pair = item.split('=')
const key = pair[0]
if (!key) return
const value = pair.slice(1).join('=')
try {
result[key] = decodeURIComponent(value || '')
} catch (e) {
result[key] = value || ''
}
})
return result
}
export function extractInviteParamsFromUrl(url) {
const value = String(url || '')
const queryIndex = value.indexOf('?')
if (queryIndex === -1) return { inviterId: '', regionId: '' }
return normalizeInviteParams(parseQueryString(value.slice(queryIndex + 1)))
}
export function buildInviteHomeSharePath(params) {
params = params || {}
const query = ['shareType=invite']
if (!isBlank(params.tabIndex)) {
appendParam(query, 'tabIndex', params.tabIndex)
}
appendInviteParams(query, params, true)
return '/pages/index/index?' + query.join('&')
}
export function buildHomeSharePath(targetPath, params) {
const inviteQuery = []
appendInviteParams(inviteQuery, params || {}, true)
if (!targetPath) {
return inviteQuery.length > 0 ? '/pages/index/index?' + inviteQuery.join('&') : '/pages/index/index'
}
let finalTargetPath = targetPath
if (inviteQuery.length > 0) {
finalTargetPath += (finalTargetPath.indexOf('?') === -1 ? '?' : '&') + inviteQuery.join('&')
}
return '/pages/index/index?targetPath=' + encodeURIComponent(finalTargetPath)
}
export function buildGroupHomeSharePath(params) {
@ -16,6 +146,7 @@ export function buildGroupHomeSharePath(params) {
if (params.orderScene) {
query.push('orderScene=' + encodeURIComponent(params.orderScene))
}
appendInviteParams(query, params, true)
return '/pages/index/index?' + query.join('&')
}
@ -30,6 +161,11 @@ export function buildGroupTargetPath(params) {
if (params.orderScene) {
targetPath += '&orderScene=' + encodeURIComponent(params.orderScene)
}
const inviteQuery = []
appendInviteParams(inviteQuery, params, false)
if (inviteQuery.length > 0) {
targetPath += '&' + inviteQuery.join('&')
}
return targetPath
}
@ -68,6 +204,7 @@ export function normalizeShareTargetPath(value) {
export function resolveHomeShareTarget(query) {
query = query || {}
rememberInviteParams(query)
if (query.shareType === 'group') {
return buildGroupTargetPath(query)
}
@ -102,6 +239,7 @@ export function getEnterShareTarget(options) {
const handledShareTargets = Object.create(null)
export function stageShareEnter(options) {
rememberInviteParams(options && options.query)
const targetPath = resolveMiniCodeSceneTarget(options && options.query && options.query.scene) || getEnterShareTarget(options)
if (!targetPath) return { targetPath: '', alreadyHandled: false }
if (handledShareTargets[targetPath]) return { targetPath: '', alreadyHandled: true }

Loading…
Cancel
Save