utils.js 3.77 KB
import { Dimensions } from 'react-native'
import { UI_WIDTH } from '../config'
import DeviceInfo from 'react-native-device-info'
import { CommonActions } from '@react-navigation/native'
import AsyncStorage from '@react-native-community/async-storage'
import CheckUtil from './check'
import { APP } from '../config'
import { FETCH } from './fetch'

/** 窗口属性 */
export const WINDOWS = Dimensions.get('window')

/** UI图缩放比例 */
const UI_SACEL = WINDOWS.width / UI_WIDTH

/**
 * 设置px单位
 * @param {*} num 
 */
export const setUnit = num => {
  return num * UI_SACEL
}

/** 获取版本号 */
export const getVersionCode = async () => await DeviceInfo.getBuildNumber()

/** 获取版本名称 */
export const getVersion = async () => await DeviceInfo.getVersion()

/** 获取屏幕高度 */
export const getHeight = () => WINDOWS.height

/** 存储数据 */
export const setStorage = async (key, value) => {
  try {
    const data = {
      type: typeof value,
      data: value
    }
    if (data.type !== 'string')
      switch (data.type) {
        case 'number':
          data.data += ''
          break
        case 'undefined':
          data.data = ''
          break
        case 'boolean':
          data.data = Number(data.data) + ''
          break
        default:
          data.data = JSON.stringify(data.data)
          break
      }

    await AsyncStorage.setItem(key, JSON.stringify(data))
  } catch (error) {
    return null
  }
}

/** 获取数据 */
export const getStorage = async key => {
  try {
    const data = JSON.parse(await AsyncStorage.getItem(key))
    switch (data.type) {
      case 'string':
        return data.data
      case 'number':
        return Number(data.data)
      case 'undefined':
        return undefined
      case 'boolean':
        return Boolean(Number(data.data))
      default:
        return JSON.parse(data.data)
    }
  } catch (error) {
    return null
  }
}
/**
 * 分单位的金额转换成元单位
 * @param  {[type]} fen [description]
 * @return {[type]}     [description]
 */
export function fen2yuan(fen) {
  if (typeof fen === 'string') fen = Number(fen)

  let y = fen / 100
  if (Number.isNaN(y))
    return '金额错误'
  else
    return y.toFixed(2)
}


/**
 * 校验手机号和验证码
 * @param {string} phone 
 * @returns {Object}
 */
export const checkPhoneAndCode = (phone, code) => {
  if (!phone.trim().length) {
    return { status: 0, msg: '手机号不能为空' }
  }
  if (!CheckUtil.isMobile(phone)) {
    return { status: 0, msg: '手机号格式不正确' }
  }
  if (!code.trim().length) {
    return { status: 0, msg: '验证码不能为空' }
  }
  return { status: 1, msg: '' }
}

/**
 * 校验两次输入的邮箱
 * @param {*} email 
 * @param {*} confirmEmail 
 * @returns {Object}
 */
export const checkEmails = (email, confirmEmail) => {
  if (!email.trim().length) {
    return { status: 0, msg: '邮箱不能为空' }
  }
  if (!CheckUtil.isEmail(email)) {
    return { status: 0, msg: '邮箱格式不正确' }
  }
  if (email !== confirmEmail) {
    return { status: 0, msg: '两次输入邮箱不一致' }
  }
  return { status: 1, msg: '' }
}

/**
 * 判断token是否过期
 * @param {*} saveTime token存储时间
 */
export const isTokenExpired = (saveTime) => {
  let now = new Date().getTime()
  return now - saveTime > APP.tokenExpires * 24 * 60 * 60 * 1000
}

/**
 * 设置网络请求头
 * @param {*} jwt 
 * @param {*} sessionId 
 */
export const setHeader = (jwt, sessionId) => {
  FETCH.setHeader('Authorization', jwt)
  FETCH.setHeader('Sessionid', sessionId)
}


/**
 * 重置路由栈
 * @param {*} navigation 
 */
export const resetRoutes = navigation => {
  navigation.dispatch(
    CommonActions.reset({
      index: 1,
      routes: [
        { name: 'Index' },
        { name: 'Login' }
      ],
    })
  )
}