diff --git a/package.json b/package.json index 2180282..cbe6df3 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "dependencies": { "fbemitter": "^3.0.0", "fbjs": "^3.0.0", + "js-cookie": "^3.0.1", "prop-types": "^15.7.2" }, "devDependencies": { diff --git a/src/store.jsx b/src/store.jsx index 481a4da..3640c65 100644 --- a/src/store.jsx +++ b/src/store.jsx @@ -1,25 +1,46 @@ -let store; +import Cookies from 'js-cookie'; -const noopStore = { - getItem: function () {}, - setItem: function () {}, -}; +// https://github.com/Modernizr/Modernizr/blob/d4c7b6082709e32fb0589ba38aa96581d44ce395/feature-detects/storage/cookies.js#L16-L35 +const cookiesEnabled = (() => { + try { + document.cookie = 'cookietest=1'; + const ret = document.cookie.indexOf('cookietest=') !== -1; + document.cookie = 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT'; + return ret; + } catch (e) { + return false; + } +})(); -if (typeof window !== 'undefined' && 'localStorage' in window) { +// https://github.com/Modernizr/Modernizr/blob/d4c7b6082709e32fb0589ba38aa96581d44ce395/feature-detects/storage/localstorage.js#L17-L46 +const localStorageEnabled = (() => { + const mod = 'modernizr'; try { - let key = '__pushtell_react__'; - window.localStorage.setItem(key, key); - if (window.localStorage.getItem(key) !== key) { - store = noopStore; - } else { - window.localStorage.removeItem(key); - store = window.localStorage; - } + localStorage.setItem(mod, mod); + localStorage.removeItem(mod); + return true; } catch (e) { - store = noopStore; + return false; } -} else { - store = noopStore; -} +})(); + +const store = { + getItem(key) { + if (localStorageEnabled) { + return localStorage.getItem(key); + } + if (cookiesEnabled) { + return Cookies.get(key); + } + }, + setItem(key, value) { + if (localStorageEnabled) { + return localStorage.setItem(key, value); + } + if (cookiesEnabled) { + return Cookies.set(key, value); + } + }, +}; export default store; diff --git a/yarn.lock b/yarn.lock index dde6290..d05c779 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4075,6 +4075,11 @@ jest@^27.0.1: import-local "^3.0.2" jest-cli "^27.0.1" +js-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.1.tgz#9e39b4c6c2f56563708d7d31f6f5f21873a92414" + integrity sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw== + js-tokens@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"