ducky/web
2015-07-07
Parent:275a83e4c02e
ducky/web/src/helpers/local-storage.js
Make production builds possible. Our production builds were erroring out, making it hard to deploy. This fixes things so that our production builds succeed, though I'm lying if I say I understand all the reasoning behind it. The major reasoning seems to be "BUGS".
| paddy@14 | 1 import log from 'andlog' |
| paddy@14 | 2 |
| paddy@14 | 3 const useChromeStorage = chrome && chrome.storage && chrome.storage.local |
| paddy@14 | 4 const hasLocalStorage = useChromeStorage || localStorage |
| paddy@14 | 5 |
| paddy@14 | 6 if (useChromeStorage) { |
| paddy@14 | 7 log.info('Using chrome local storage') |
| paddy@14 | 8 } else if (hasLocalStorage) { |
| paddy@14 | 9 log.info('Using HTML5 local storage') |
| paddy@14 | 10 } else { |
| paddy@14 | 11 log.error('No acceptable local storage option found.') |
| paddy@14 | 12 } |
| paddy@14 | 13 |
| paddy@14 | 14 const get = (keys) => { |
| paddy@14 | 15 const single = !(keys instanceof Array) |
| paddy@14 | 16 if (single) { |
| paddy@14 | 17 keys = [keys] |
| paddy@14 | 18 } |
| paddy@14 | 19 log.info('Retrieving', keys, 'from local storage') |
| paddy@14 | 20 return new Promise((resolve, reject) => { |
| paddy@14 | 21 if (useChromeStorage) { |
| paddy@14 | 22 chrome.storage.local.get(keys, (results) => { |
| paddy@14 | 23 if (runtime && runtime.lastError) { |
| paddy@14 | 24 reject(runtime.lastError) |
| paddy@14 | 25 log.error('Error retrieving', keys, 'from local storage:', runtime.lastError) |
| paddy@14 | 26 return |
| paddy@14 | 27 } |
| paddy@14 | 28 if (single) { |
| paddy@14 | 29 results = results[keys[0]] |
| paddy@14 | 30 } |
| paddy@14 | 31 log.info('Retrieved', results, 'from local storage when asking for', keys) |
| paddy@14 | 32 resolve(results) |
| paddy@14 | 33 }) |
| paddy@14 | 34 } else if (hasLocalStorage) { |
| paddy@14 | 35 let results = {} |
| paddy@14 | 36 keys.forEach((key) => { |
| paddy@14 | 37 results[key] = localStorage.getItem(key) |
| paddy@14 | 38 }) |
| paddy@14 | 39 if (single) { |
| paddy@14 | 40 results = results[keys[0]] |
| paddy@14 | 41 } |
| paddy@14 | 42 log.info('Retrieved', results, 'from local storage when asking for', keys) |
| paddy@14 | 43 resolve(results) |
| paddy@14 | 44 } else { |
| paddy@14 | 45 log.error('No valid local storage options') |
| paddy@14 | 46 reject('No valid local storage options') |
| paddy@14 | 47 } |
| paddy@14 | 48 }) |
| paddy@14 | 49 } |
| paddy@14 | 50 |
| paddy@14 | 51 const set = (key, value) => { |
| paddy@14 | 52 log.info('Setting', key, 'to', value, 'in local storage') |
| paddy@14 | 53 if (useChromeStorage) { |
| paddy@14 | 54 chrome.storage.local.set(key, value, () => { |
| paddy@14 | 55 if (runtime && runtime.lastError) { |
| paddy@14 | 56 console.error('Error storing data in local storage:', runtime.lastError) |
| paddy@14 | 57 } |
| paddy@14 | 58 }) |
| paddy@14 | 59 } else if (hasLocalStorage) { |
| paddy@14 | 60 localStorage.setItem(key, value) |
| paddy@14 | 61 } else { |
| paddy@14 | 62 console.error('No valid local storage options') |
| paddy@14 | 63 } |
| paddy@14 | 64 log.info('Set', key, 'to', value, 'in local storage') |
| paddy@14 | 65 } |
| paddy@14 | 66 |
| paddy@14 | 67 const remove = (keys) => { |
| paddy@14 | 68 if(!(keys instanceof Array)) { |
| paddy@14 | 69 keys = [keys] |
| paddy@14 | 70 } |
| paddy@14 | 71 log.info('Removing', keys, 'from local storage') |
| paddy@14 | 72 if (useChromeStorage) { |
| paddy@14 | 73 chrome.storage.local.remove(keys, () => { |
| paddy@14 | 74 if (runtime && runtime.lastError) { |
| paddy@14 | 75 console.error('Error removing data from local storage:', runtime.lastError) |
| paddy@14 | 76 } |
| paddy@14 | 77 }) |
| paddy@14 | 78 } else if (hasLocalStorage) { |
| paddy@14 | 79 keys.forEach((key) => { |
| paddy@14 | 80 localStorage.removeItem(key) |
| paddy@14 | 81 }) |
| paddy@14 | 82 } else { |
| paddy@14 | 83 console.error('No valid local storage options') |
| paddy@14 | 84 } |
| paddy@14 | 85 log.info('Removed', keys, 'from local storage') |
| paddy@14 | 86 } |
| paddy@14 | 87 |
| paddy@14 | 88 const clear = () => { |
| paddy@14 | 89 log.info('Clearing local storage') |
| paddy@14 | 90 if (useChromeStorage) { |
| paddy@14 | 91 chrome.storage.local.clear(() => { |
| paddy@14 | 92 if (runtime && runtime.lastError) { |
| paddy@14 | 93 console.error('Error clearing data in local storage:', runtime.lastError) |
| paddy@14 | 94 } |
| paddy@14 | 95 }) |
| paddy@14 | 96 } else if (hasLocalStorage) { |
| paddy@14 | 97 localStorage.clear() |
| paddy@14 | 98 } else { |
| paddy@14 | 99 console.error('No valid local storage options') |
| paddy@14 | 100 } |
| paddy@14 | 101 log.info('Cleared local storage') |
| paddy@14 | 102 } |
| paddy@14 | 103 |
| paddy@14 | 104 const storage = { |
| paddy@14 | 105 get: get, |
| paddy@14 | 106 set: set, |
| paddy@14 | 107 remove: remove, |
| paddy@14 | 108 clear: clear |
| paddy@14 | 109 } |
| paddy@14 | 110 |
| paddy@14 | 111 export default storage |