feat(user): 使用微信原生 Picker 替换所在地选择弹层

- 删除 NutUI Address 相关导入、状态及地区数据转换逻辑
- 新增派生 regionValue 用于绑定微信原生 Picker 的 value
- 将 handleRegionChange 调整为处理微信 Picker 的事件
- 将所在地选择 UI 修改为微信原生 Picker 包裹的视图结构
- 地图定位失败使用弹窗提示,引导用户手动选择或重试
- 移除手动打开地区选择器的函数及 NutUI 组件
- 保留 RegionData 用于文本智能识别解析
- 编译通过,提升在无地图或无权限环境下的地区选择稳定性
This commit is contained in:
2026-07-13 08:16:17 +08:00
parent 70ad1d030f
commit d6d6b1f5a7
16 changed files with 546 additions and 25 deletions

69
src/hooks/useShare.ts Normal file
View File

@@ -0,0 +1,69 @@
import { useRef } from 'react'
import Taro, { useShareAppMessage, useShareTimeline } from '@tarojs/taro'
import { useUser } from './useUser'
export interface UseShareOptions {
/** 分享标题 */
title: string
/** 分享给好友的完整 path含或不含 query如 /pages/shop/product-detail?id=123 */
path?: string
/** 朋友圈的 query不含 page 与 ?),如 id=123会被拼到当前页 path 之后 */
query?: string
/** 封面图(海报临时路径或网络图地址),不传则微信截取页面 */
imageUrl?: string
}
/** 当前是否处于朋友圈单页模式scene=1154 */
export function isTimelineSinglePage(): boolean {
try {
const options = Taro.getEnterOptionsSync()
return options?.scene === 1154
} catch {
return false
}
}
function buildPath(path: string | undefined, inviterId?: number | string): string {
if (!path) return ''
if (!inviterId) return path
const sep = path.includes('?') ? '&' : '?'
return `${path}${sep}inviter=${inviterId}`
}
function buildQuery(query: string | undefined, inviterId?: number | string): string {
const parts: string[] = []
if (query) parts.push(query)
if (inviterId) parts.push(`inviter=${inviterId}`)
return parts.join('&')
}
/**
* 统一注册「分享给好友」与「分享到朋友圈」回调。
* 自动在 path/query 中追加 inviter当前登录用户 id用于分销裂变。
* 注意:朋友圈分享仅对非 tabBar 页生效,需在页面 config 中设置 enableShareTimeline: true。
*/
export function useShare(options: UseShareOptions) {
const { user } = useUser()
const inviterId = user?.id ?? user?.userId
// 用 ref 保证分享触发时读取到最新 options含异步生成的海报图
const optionsRef = useRef(options)
optionsRef.current = options
useShareAppMessage(() => {
const o = optionsRef.current
return {
title: o.title,
path: buildPath(o.path, inviterId),
imageUrl: o.imageUrl,
}
})
useShareTimeline(() => {
const o = optionsRef.current
return {
title: o.title,
query: buildQuery(o.query, inviterId),
imageUrl: o.imageUrl,
}
})
}