@ucam/design-system
Version:
University of Cambridge Design System
51 lines (47 loc) • 5.69 kB
JavaScript
;
var React = require('react');
var useHydrated = require('../useHydrated/useHydrated.js');
function localStorageAvailable() {
// https://gist.github.com/paulirish/5558557
try {
const testString = '__test_localStorage__';
localStorage.setItem(testString, testString);
localStorage.removeItem(testString);
return true;
}
catch (e) {
return false;
}
}
/**
* A React Hook to gets an item from local storage.
* It handles SSR by returning the defaultValue for the initial hydration render, regardless of value in localStorage.
* It must be used inside a `<HydrationChecker/>` (`<ThemeProvider/>` does this automatically).
*/
const useLocalStorage = (key, options) => {
const localStorageValue = localStorageAvailable() ? localStorage.getItem(key) : null;
const hydrated = useHydrated.useHydrated();
const [currentValue, setCurrentValue] = React.useState(localStorageValue == null ? options === null || options === void 0 ? void 0 : options.defaultValue : localStorageValue);
const setValue = (value) => {
if (currentValue === value) {
return;
}
if (localStorageAvailable()) {
if (value == undefined) {
localStorage.removeItem(key);
}
else {
localStorage.setItem(key, value);
}
}
setCurrentValue(value);
};
if (hydrated) {
return [currentValue, setValue];
}
else {
return [options === null || options === void 0 ? void 0 : options.defaultValue, setValue];
}
};
module.exports = useLocalStorage;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlTG9jYWxTdG9yYWdlLmpzIiwic291cmNlcyI6WyIvQHVjYW0vZGVzaWduLXN5c3RlbS9zcmMvdXNlTG9jYWxTdG9yYWdlL3VzZUxvY2FsU3RvcmFnZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VIeWRyYXRlZCBmcm9tICcuLi91c2VIeWRyYXRlZCc7XG5cbmZ1bmN0aW9uIGxvY2FsU3RvcmFnZUF2YWlsYWJsZSgpIHtcbiAgLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vcGF1bGlyaXNoLzU1NTg1NTdcbiAgdHJ5IHtcbiAgICBjb25zdCB0ZXN0U3RyaW5nID0gJ19fdGVzdF9sb2NhbFN0b3JhZ2VfXyc7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdFN0cmluZywgdGVzdFN0cmluZyk7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdFN0cmluZyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2NhbFN0b3JhZ2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIHJldHVybmVkIGR1cmluZyBoeWRyYXRpb24gb3IgaWYgbG9jYWxTdG9yYWdlIGRvZXMgbm90IGNvbnRhaW4gYSB2YWx1ZS5cbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBIFJlYWN0IEhvb2sgdG8gZ2V0cyBhbiBpdGVtIGZyb20gbG9jYWwgc3RvcmFnZS5cbiAqIEl0IGhhbmRsZXMgU1NSIGJ5IHJldHVybmluZyB0aGUgZGVmYXVsdFZhbHVlIGZvciB0aGUgaW5pdGlhbCBoeWRyYXRpb24gcmVuZGVyLCByZWdhcmRsZXNzIG9mIHZhbHVlIGluIGxvY2FsU3RvcmFnZS5cbiAqIEl0IG11c3QgYmUgdXNlZCBpbnNpZGUgYSBgPEh5ZHJhdGlvbkNoZWNrZXIvPmAgKGA8VGhlbWVQcm92aWRlci8+YCBkb2VzIHRoaXMgYXV0b21hdGljYWxseSkuXG4gKi9cbmNvbnN0IHVzZUxvY2FsU3RvcmFnZSA9IChcbiAga2V5OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBMb2NhbFN0b3JhZ2VPcHRpb25zXG4pOiBbc3RyaW5nIHwgdW5kZWZpbmVkLCAodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gdm9pZF0gPT4ge1xuICBjb25zdCBsb2NhbFN0b3JhZ2VWYWx1ZSA9IGxvY2FsU3RvcmFnZUF2YWlsYWJsZSgpID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSA6IG51bGw7XG4gIGNvbnN0IGh5ZHJhdGVkID0gdXNlSHlkcmF0ZWQoKTtcbiAgY29uc3QgW2N1cnJlbnRWYWx1ZSwgc2V0Q3VycmVudFZhbHVlXSA9IHVzZVN0YXRlPHVuZGVmaW5lZCB8IHN0cmluZz4oXG4gICAgbG9jYWxTdG9yYWdlVmFsdWUgPT0gbnVsbCA/IG9wdGlvbnM/LmRlZmF1bHRWYWx1ZSA6IGxvY2FsU3RvcmFnZVZhbHVlXG4gICk7XG5cbiAgY29uc3Qgc2V0VmFsdWUgPSAodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuICAgIGlmIChjdXJyZW50VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChsb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSkge1xuICAgICAgaWYgKHZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNldEN1cnJlbnRWYWx1ZSh2YWx1ZSk7XG4gIH07XG5cbiAgaWYgKGh5ZHJhdGVkKSB7XG4gICAgcmV0dXJuIFtjdXJyZW50VmFsdWUsIHNldFZhbHVlXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW29wdGlvbnM/LmRlZmF1bHRWYWx1ZSwgc2V0VmFsdWVdO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCB1c2VMb2NhbFN0b3JhZ2U7XG4iXSwibmFtZXMiOlsidXNlSHlkcmF0ZWQiLCJ1c2VTdGF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSxTQUFTLHFCQUFxQjs7SUFFNUIsSUFBSTtRQUNGLE1BQU0sVUFBVSxHQUFHLHVCQUF1QixDQUFDO1FBQzNDLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLFlBQVksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxLQUFLLENBQUM7S0FDZDtBQUNILENBQUM7QUFTRDs7Ozs7TUFLTSxlQUFlLEdBQUcsQ0FDdEIsR0FBVyxFQUNYLE9BQTZCO0lBRTdCLE1BQU0saUJBQWlCLEdBQUcscUJBQXFCLEVBQUUsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNyRixNQUFNLFFBQVEsR0FBR0EsdUJBQVcsRUFBRSxDQUFDO0lBQy9CLE1BQU0sQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLEdBQUdDLGNBQVEsQ0FDOUMsaUJBQWlCLElBQUksSUFBSSxHQUFHLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxZQUFZLEdBQUcsaUJBQWlCLENBQ3RFLENBQUM7SUFFRixNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQXlCO1FBQ3pDLElBQUksWUFBWSxLQUFLLEtBQUssRUFBRTtZQUMxQixPQUFPO1NBQ1I7UUFDRCxJQUFJLHFCQUFxQixFQUFFLEVBQUU7WUFDM0IsSUFBSSxLQUFLLElBQUksU0FBUyxFQUFFO2dCQUN0QixZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQzlCO2lCQUFNO2dCQUNMLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ2xDO1NBQ0Y7UUFDRCxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDeEIsQ0FBQztJQUVGLElBQUksUUFBUSxFQUFFO1FBQ1osT0FBTyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztLQUNqQztTQUFNO1FBQ0wsT0FBTyxDQUFDLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDMUM7QUFDSDs7OzsifQ==