'f'
mh-two-thousand-and-two
2024-04-12 26f2711ef9461961fb953e2b497bd314ef95e345
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import { translateCoordinateSystem } from '../../../helpers/location'
 
const { invokeCallbackHandler: invoke } = UniServiceJSBridge
let successCallbackIds = []
let errorCallbackIds = []
let started = false
let watchId = 0
 
export function startLocationUpdate ({ type = 'gcj02' }, callbackId) {
  if (!navigator.geolocation) {
    return {
      errMsg: 'startLocationUpdate:fail'
    }
  }
 
  watchId = watchId || navigator.geolocation.watchPosition(
    res => {
      started = true
      translateCoordinateSystem(type, res.coords)
        .then((coords) => {
          successCallbackIds.forEach(callbackId => {
            invoke(callbackId, coords)
          })
        }).catch(error => {
          errorCallbackIds.forEach(callbackId => {
            invoke(callbackId, {
              errMsg: `onLocationChange:fail ${error.message}`
            })
          })
        })
    },
    error => {
      if (!started) {
        invoke(callbackId, { errMsg: `startLocationUpdate:fail ${error.message}` })
        started = true
      }
      errorCallbackIds.forEach(callbackId => {
        invoke(callbackId, {
          errMsg: `onLocationChange:fail ${error.message}`
        })
      })
    }
  )
  setTimeout(() => {
    invoke(callbackId, {
      errMsg: 'startLocationUpdate:ok'
    })
  }, 100)
}
 
export function stopLocationUpdate () {
  if (watchId !== 0) {
    navigator.geolocation.clearWatch(watchId)
    started = false
    watchId = 0
  }
  return {}
}
 
export function onLocationChange (callbackId) {
  successCallbackIds.push(callbackId)
}
 
export function offLocationChange (callbackId) {
  if (callbackId) {
    const index = successCallbackIds.indexOf(callbackId)
    if (index >= 0) {
      successCallbackIds.splice(index, 1)
    }
  } else {
    successCallbackIds = []
  }
}
 
export function onLocationChangeError (callbackId) {
  errorCallbackIds.push(callbackId)
}
 
export function offLocationChangeError (callbackId) {
  if (callbackId) {
    const index = errorCallbackIds.indexOf(callbackId)
    if (index >= 0) {
      errorCallbackIds.splice(index, 1)
    }
  } else {
    errorCallbackIds = []
  }
}