compass.ts 1.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
import {
  defineAsyncApi,
  API_ON_COMPASS,
  API_TYPE_ON_COMPASS_CHANGE,
  API_OFF_COMPASS,
  API_TYPE_OFF_COMPASS_CHANGE,
  API_START_COMPASS,
  API_TYPE_START_COMPASS,
  API_STOP_COMPASS,
  API_TYPE_STOP_COMPASS,
  defineOnApi,
12
  defineOffApi,
13 14 15 16 17 18 19 20 21 22 23 24
} from '@dcloudio/uni-api'
import { DEVICE_FREQUENCY } from '../constants'

let listener: number | null = null

export const onCompassChange = <API_TYPE_ON_COMPASS_CHANGE>(
  defineOnApi(API_ON_COMPASS, () => {
    startCompass()
  })
)

export const offCompassChange = <API_TYPE_OFF_COMPASS_CHANGE>(
25
  defineOffApi(API_OFF_COMPASS, () => {
26 27 28 29 30 31 32
    stopCompass()
  })
)

export const startCompass = <API_TYPE_START_COMPASS>(
  defineAsyncApi(API_START_COMPASS, (_, { resolve, reject }) => {
    if (!listener) {
33
      listener = plus.orientation.watchOrientation(
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
        (res) => {
          UniServiceJSBridge.invokeOnCallback(API_ON_COMPASS, {
            direction: res.magneticHeading,
          })
        },
        (err) => {
          reject(err.message)
          listener = null
        },
        {
          frequency: DEVICE_FREQUENCY,
        }
      )
    }
    setTimeout(resolve, DEVICE_FREQUENCY)
  })
)

export const stopCompass = <API_TYPE_STOP_COMPASS>(
  defineAsyncApi(API_STOP_COMPASS, (_, { resolve }) => {
    if (listener) {
      plus.orientation.clearWatch(listener)
      listener = null
    }
    resolve()
  })
)