respond-framework
Version:
create as fast you think
78 lines (75 loc) • 2.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.native = exports.default = void 0;
var _asyncStorage = require("@react-native-async-storage/async-storage");
var _constants = require("../helpers/constants.js");
// todo: replace with fast sync storage: https://github.com/mrousavy/react-native-mmkv
const prefix = '__respond_session.';
const mock = {
getItem(k) {
return this[k];
},
setItem(k, v) {
this[k] = v;
},
removeItem(k) {
delete this[k];
},
clear() {
Object.keys(this).forEach(k => delete this[k]);
}
};
const web = {
getItem(k) {
return sessionStorage.getItem(prefix + k);
},
setItem(k, v) {
return sessionStorage.setItem(prefix + k, v);
},
removeItem(k) {
return sessionStorage.removeItem(prefix + k);
},
clear() {
sessionStorage.clear();
}
};
const native = exports.native = {
getItem(k) {
return this[k];
},
removeItem(k) {
delete this[k];
_asyncStorage.default.removeItem(prefix + k).catch(swallowed => swallowed);
},
setItem(k, v) {
this[k] = v;
// mimic browser sessionStorage behavior
if (v === null) v = 'null';
if (v === undefined) v = 'undefined';
_asyncStorage.default.setItem(prefix + k, v).catch(swallowed => swallowed);
},
clear() {
Object.keys(native).forEach(k => {
if (typeof native[k] === 'function') return;
delete native[k];
});
return _asyncStorage.default.clear();
},
async populate() {
// until sync storage is available as a dep on native, await sessionStorage.populate() must be called on app start
try {
const keys = await _asyncStorage.default.getAllKeys();
const appKeys = keys.filter(k => k.startsWith(prefix));
const values = await _asyncStorage.default.multiGet(appKeys);
values.forEach(([k, v]) => {
const key = k.slice(prefix.length);
this[key] = v;
});
} catch (e) {
console.log('populate.error', e);
}
}
};
var _default = exports.default = _constants.isNative ? native : typeof sessionStorage === 'undefined' ? mock : web;