MrShi
12 小时以前 00a7a61df86db969f2ba61c508d02ba4709ce3d4
app/utils/utils.js
@@ -47,3 +47,159 @@
   })
   return promise;
}
const LOCATION_NOTICE_STORAGE_KEY = 'location_permission_notice_shown'
const IMAGE_NOTICE_STORAGE_KEY = 'image_permission_notice_shown'
const DEFAULT_LOCATION_NOTICE = {
   title: '获取位置信息',
   content: '为了给您分配附近的订单,并计算接送货的精准距离与导航路线,本应用需要获取您的位置信息。',
   confirmText: '已知晓'
}
const DEFAULT_IMAGE_NOTICE = {
   title: '获取相机权限',
   content: '为了支持您进行司机身份认证,以及方便您在取送件时拍照留存凭证,本应用需要获取您的相机与相册权限。',
   confirmText: '已知晓'
}
export function ensureLocationPermissionNotice(modalOptions = {}) {
   const hasShown = uni.getStorageSync(LOCATION_NOTICE_STORAGE_KEY)
   if (hasShown) {
      return Promise.resolve(true)
   }
   const options = Object.assign({}, DEFAULT_LOCATION_NOTICE, modalOptions)
   return new Promise((resolve) => {
      uni.showModal({
         title: options.title,
         content: options.content,
         confirmText: options.confirmText,
         showCancel: false,
         success: (res) => {
            if (res.confirm) {
               uni.setStorageSync(LOCATION_NOTICE_STORAGE_KEY, true)
               resolve(true)
               return
            }
            resolve(false)
         },
         fail: () => {
            resolve(false)
         }
      })
   })
}
export function getLocationWithNotice(locationOptions = {}, modalOptions = {}) {
   return ensureLocationPermissionNotice(modalOptions).then((confirmed) => {
      if (!confirmed) {
         return Promise.reject({ errMsg: 'location permission notice canceled' })
      }
      return new Promise((resolve, reject) => {
         uni.getLocation(Object.assign({}, locationOptions, {
            success: (res) => {
               uni.$emit('locationPermissionGranted', res)
               if (typeof locationOptions.success === 'function') {
                  locationOptions.success(res)
               }
               resolve(res)
            },
            fail: (err) => {
               if (typeof locationOptions.fail === 'function') {
                  locationOptions.fail(err)
               }
               reject(err)
            }
         }))
      })
   })
}
export function ensureImagePermissionNotice(modalOptions = {}) {
   const hasShown = uni.getStorageSync(IMAGE_NOTICE_STORAGE_KEY)
   if (hasShown) {
      return Promise.resolve(true)
   }
   const options = Object.assign({}, DEFAULT_IMAGE_NOTICE, modalOptions)
   return new Promise((resolve) => {
      uni.showModal({
         title: options.title,
         content: options.content,
         confirmText: options.confirmText,
         showCancel: false,
         success: (res) => {
            if (res.confirm) {
               uni.setStorageSync(IMAGE_NOTICE_STORAGE_KEY, true)
               resolve(true)
               return
            }
            resolve(false)
         },
         fail: () => {
            resolve(false)
         }
      })
   })
}
export function chooseImageWithNotice(imageOptions = {}, modalOptions = {}) {
   return ensureImagePermissionNotice(modalOptions).then((confirmed) => {
      if (!confirmed) {
         return Promise.reject({ errMsg: 'image permission notice canceled' })
      }
      return new Promise((resolve, reject) => {
         uni.chooseImage(Object.assign({}, imageOptions, {
            success: (res) => {
               if (typeof imageOptions.success === 'function') {
                  imageOptions.success(res)
               }
               resolve(res)
            },
            fail: (err) => {
               const errMsg = (err && err.errMsg) || ''
               if (errMsg && !/cancel/i.test(errMsg)) {
                  uni.showToast({
                     title: '需要授权相机权限',
                     icon: 'none'
                  })
               }
               if (typeof imageOptions.fail === 'function') {
                  imageOptions.fail(err)
               }
               reject(err)
            }
         }))
      })
   })
}
export function checkLocationPermission() {
   return new Promise((resolve) => {
      if (typeof uni.getAppAuthorizeSetting === 'function') {
         try {
            const setting = uni.getAppAuthorizeSetting()
            const locationAuthorized = setting.locationAuthorized
            resolve(locationAuthorized === 'authorized' || locationAuthorized === 'authorizedAlways')
            return
         } catch (e) {
            console.log('getAppAuthorizeSetting fail', e)
         }
      }
      uni.getSetting({
         success: (res) => {
            const authSetting = res.authSetting || {}
            resolve(!!authSetting['scope.userLocation'])
         },
         fail: () => {
            resolve(false)
         }
      })
   })
}