storage.js 3.7 KB
Newer Older
Q
qiang 已提交
1 2 3
const STORAGE_DATA_TYPE = '__TYPE'
const STORAGE_KEYS = 'uni-storage-keys'

4 5 6
function parseValue (value) {
  const types = ['object', 'string', 'number', 'boolean', 'undefined']
  try {
7 8 9
    const object = typeof value === 'string' ? JSON.parse(value) : value
    const type = object.type
    if (types.indexOf(type) >= 0) {
10
      const keys = Object.keys(object)
11 12
      // eslint-disable-next-line valid-typeof
      if (keys.length === 2 && 'data' in object && typeof object.data === type) {
13
        return object.data
14
      } else if (keys.length === 1) {
15 16 17 18 19 20
        return ''
      }
    }
  } catch (error) { }
}

fxy060608's avatar
fxy060608 已提交
21 22 23 24
export function setStorage ({
  key,
  data
} = {}) {
Q
qiang 已提交
25 26 27
  const type = typeof data
  const value = type === 'string' ? data : JSON.stringify({
    type,
fxy060608's avatar
fxy060608 已提交
28
    data: data
Q
qiang 已提交
29 30
  })
  try {
31
    if (type === 'string' && parseValue(value) !== undefined) {
32
      localStorage.setItem(key + STORAGE_DATA_TYPE, type)
33 34 35
    } else {
      localStorage.removeItem(key + STORAGE_DATA_TYPE)
    }
Q
qiang 已提交
36 37 38 39
    localStorage.setItem(key, value)
  } catch (error) {
    return {
      errMsg: `setStorage:fail ${error}`
fxy060608's avatar
fxy060608 已提交
40 41 42 43 44 45 46 47
    }
  }
  return {
    errMsg: 'setStorage:ok'
  }
}

export function setStorageSync (key, data) {
fxy060608's avatar
fxy060608 已提交
48 49 50 51
  setStorage({
    key,
    data
  })
fxy060608's avatar
fxy060608 已提交
52 53 54 55 56
}

export function getStorage ({
  key
} = {}) {
Q
qiang 已提交
57 58 59 60 61 62 63 64
  const value = localStorage && localStorage.getItem(key)
  if (typeof value !== 'string') {
    return {
      data: '',
      errMsg: 'getStorage:fail'
    }
  }
  let data = value
65 66 67
  const typeOrigin = localStorage.getItem(key + STORAGE_DATA_TYPE) || ''
  const type = typeOrigin.toLowerCase()
  if (type !== 'string' || (typeOrigin === 'String' && value === '{"type":"undefined"}')) {
68
    try {
69 70 71 72 73 74 75 76 77 78 79 80 81 82
      // 兼容H5和V3初期历史格式
      let object = JSON.parse(value)
      const result = parseValue(object)
      if (result !== undefined) {
        data = result
      } else if (type) {
        // 兼容App端历史格式
        data = object
        if (typeof object === 'string') {
          object = JSON.parse(object)
          // eslint-disable-next-line valid-typeof
          data = typeof object === (type === 'null' ? 'object' : type) ? object : data
        }
      }
83 84
    } catch (error) { }
  }
Q
qiang 已提交
85 86
  return {
    data,
fxy060608's avatar
fxy060608 已提交
87 88 89 90 91
    errMsg: 'getStorage:ok'
  }
}

export function getStorageSync (key) {
fxy060608's avatar
fxy060608 已提交
92 93 94
  const res = getStorage({
    key
  })
fxy060608's avatar
fxy060608 已提交
95 96 97 98 99 100
  return res.data
}

export function removeStorage ({
  key
} = {}) {
Q
qiang 已提交
101 102 103 104
  if (localStorage) {
    // 兼容App端历史格式
    localStorage.removeItem(key + STORAGE_DATA_TYPE)
    localStorage.removeItem(key)
fxy060608's avatar
fxy060608 已提交
105 106 107 108 109 110 111
  }
  return {
    errMsg: 'removeStorage:ok'
  }
}

export function removeStorageSync (key) {
fxy060608's avatar
fxy060608 已提交
112 113 114
  removeStorage({
    key
  })
fxy060608's avatar
fxy060608 已提交
115 116 117
}

export function clearStorage () {
Q
qiang 已提交
118
  localStorage && localStorage.clear()
fxy060608's avatar
fxy060608 已提交
119 120 121 122
  return {
    errMsg: 'clearStorage:ok'
  }
}
fxy060608's avatar
fxy060608 已提交
123

fxy060608's avatar
fxy060608 已提交
124 125 126 127
export function clearStorageSync () {
  clearStorage()
}

Q
qiang 已提交
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
export function getStorageInfo () {
  const length = (localStorage && (localStorage.length || localStorage.getLength())) || 0
  const keys = []
  let currentSize = 0
  for (let index = 0; index < length; index++) {
    const key = localStorage.key(index)
    if (key !== STORAGE_KEYS && key.indexOf(STORAGE_DATA_TYPE) + STORAGE_DATA_TYPE.length !== key.length) {
      const value = localStorage.getItem(key)
      currentSize += key.length + value.length
      keys.push(key)
    }
  }
  return {
    keys,
    currentSize: Math.ceil(currentSize * 2 / 1024),
    limitSize: Number.MAX_VALUE,
fxy060608's avatar
fxy060608 已提交
144 145 146 147 148 149 150 151
    errMsg: 'getStorageInfo:ok'
  }
}

export function getStorageInfoSync () {
  const res = getStorageInfo()
  delete res.errMsg
  return res
Q
qiang 已提交
152
}