ducky/web
2015-07-07
Parent:275a83e4c02e
ducky/web/src/helpers/local-storage.js
Fix bug in oauth-refresh, update for hosted path. Our nginx-fronted path has changed, so update the helper to hit the right URL. Also, fix a bug that would cause every failed request to be retried, which was suboptimal.
1 import log from 'andlog'
3 const useChromeStorage = chrome && chrome.storage && chrome.storage.local
4 const hasLocalStorage = useChromeStorage || localStorage
6 if (useChromeStorage) {
7 log.info('Using chrome local storage')
8 } else if (hasLocalStorage) {
9 log.info('Using HTML5 local storage')
10 } else {
11 log.error('No acceptable local storage option found.')
12 }
14 const get = (keys) => {
15 const single = !(keys instanceof Array)
16 if (single) {
17 keys = [keys]
18 }
19 log.info('Retrieving', keys, 'from local storage')
20 return new Promise((resolve, reject) => {
21 if (useChromeStorage) {
22 chrome.storage.local.get(keys, (results) => {
23 if (runtime && runtime.lastError) {
24 reject(runtime.lastError)
25 log.error('Error retrieving', keys, 'from local storage:', runtime.lastError)
26 return
27 }
28 if (single) {
29 results = results[keys[0]]
30 }
31 log.info('Retrieved', results, 'from local storage when asking for', keys)
32 resolve(results)
33 })
34 } else if (hasLocalStorage) {
35 let results = {}
36 keys.forEach((key) => {
37 results[key] = localStorage.getItem(key)
38 })
39 if (single) {
40 results = results[keys[0]]
41 }
42 log.info('Retrieved', results, 'from local storage when asking for', keys)
43 resolve(results)
44 } else {
45 log.error('No valid local storage options')
46 reject('No valid local storage options')
47 }
48 })
49 }
51 const set = (key, value) => {
52 log.info('Setting', key, 'to', value, 'in local storage')
53 if (useChromeStorage) {
54 chrome.storage.local.set(key, value, () => {
55 if (runtime && runtime.lastError) {
56 console.error('Error storing data in local storage:', runtime.lastError)
57 }
58 })
59 } else if (hasLocalStorage) {
60 localStorage.setItem(key, value)
61 } else {
62 console.error('No valid local storage options')
63 }
64 log.info('Set', key, 'to', value, 'in local storage')
65 }
67 const remove = (keys) => {
68 if(!(keys instanceof Array)) {
69 keys = [keys]
70 }
71 log.info('Removing', keys, 'from local storage')
72 if (useChromeStorage) {
73 chrome.storage.local.remove(keys, () => {
74 if (runtime && runtime.lastError) {
75 console.error('Error removing data from local storage:', runtime.lastError)
76 }
77 })
78 } else if (hasLocalStorage) {
79 keys.forEach((key) => {
80 localStorage.removeItem(key)
81 })
82 } else {
83 console.error('No valid local storage options')
84 }
85 log.info('Removed', keys, 'from local storage')
86 }
88 const clear = () => {
89 log.info('Clearing local storage')
90 if (useChromeStorage) {
91 chrome.storage.local.clear(() => {
92 if (runtime && runtime.lastError) {
93 console.error('Error clearing data in local storage:', runtime.lastError)
94 }
95 })
96 } else if (hasLocalStorage) {
97 localStorage.clear()
98 } else {
99 console.error('No valid local storage options')
100 }
101 log.info('Cleared local storage')
102 }
104 const storage = {
105 get: get,
106 set: set,
107 remove: remove,
108 clear: clear
109 }
111 export default storage