41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
import type { WechatOpenLocationTarget } from '@/utils/wechatOpenLocationProtocol'
|
|
|
|
export type WechatOpenLocationResult =
|
|
| { status: 'opened' }
|
|
| { status: 'failed'; reason: 'api-failed' | 'timeout' }
|
|
|
|
const OPEN_LOCATION_TIMEOUT = 5000
|
|
|
|
export const openWechatHostLocation = (
|
|
target: WechatOpenLocationTarget
|
|
) => new Promise<WechatOpenLocationResult>((resolve) => {
|
|
let settled = false
|
|
const finish = (result: WechatOpenLocationResult) => {
|
|
if (settled) return
|
|
settled = true
|
|
clearTimeout(timeout)
|
|
resolve(result)
|
|
}
|
|
const timeout = setTimeout(() => {
|
|
finish({ status: 'failed', reason: 'timeout' })
|
|
}, OPEN_LOCATION_TIMEOUT)
|
|
|
|
try {
|
|
uni.openLocation({
|
|
latitude: target.latitude,
|
|
longitude: target.longitude,
|
|
name: target.name,
|
|
address: target.address || '',
|
|
scale: 18,
|
|
success: () => finish({ status: 'opened' }),
|
|
fail: (error) => {
|
|
console.error('打开地图位置失败:', error)
|
|
finish({ status: 'failed', reason: 'api-failed' })
|
|
}
|
|
})
|
|
} catch (error) {
|
|
console.error('调用微信地图能力失败:', error)
|
|
finish({ status: 'failed', reason: 'api-failed' })
|
|
}
|
|
})
|