40
src/services/WechatOpenLocationService.ts
Normal file
40
src/services/WechatOpenLocationService.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
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' })
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user