Added fake storage shim for local and session storage
This commit is contained in:
parent
7aed345baf
commit
d0002431c5
@ -4,18 +4,27 @@ import shortid from "shortid";
|
|||||||
import DatabaseContext from "./DatabaseContext";
|
import DatabaseContext from "./DatabaseContext";
|
||||||
|
|
||||||
import { getRandomMonster } from "../helpers/monsters";
|
import { getRandomMonster } from "../helpers/monsters";
|
||||||
|
import FakeStorage from "../helpers/FakeStorage";
|
||||||
|
|
||||||
const AuthContext = React.createContext();
|
const AuthContext = React.createContext();
|
||||||
|
|
||||||
|
let storage;
|
||||||
|
try {
|
||||||
|
sessionStorage.setItem("__test", "__test");
|
||||||
|
sessionStorage.removeItem("__test");
|
||||||
|
storage = sessionStorage;
|
||||||
|
} catch (e) {
|
||||||
|
console.warn("Session storage is disabled, no authentication will be saved");
|
||||||
|
storage = new FakeStorage();
|
||||||
|
}
|
||||||
|
|
||||||
export function AuthProvider({ children }) {
|
export function AuthProvider({ children }) {
|
||||||
const { database } = useContext(DatabaseContext);
|
const { database } = useContext(DatabaseContext);
|
||||||
|
|
||||||
const [password, setPassword] = useState(
|
const [password, setPassword] = useState(storage.getItem("auth") || "");
|
||||||
sessionStorage.getItem("auth") || ""
|
|
||||||
);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
sessionStorage.setItem("auth", password);
|
storage.setItem("auth", password);
|
||||||
}, [password]);
|
}, [password]);
|
||||||
|
|
||||||
const [authenticationStatus, setAuthenticationStatus] = useState("unknown");
|
const [authenticationStatus, setAuthenticationStatus] = useState("unknown");
|
||||||
|
23
src/helpers/FakeStorage.js
Normal file
23
src/helpers/FakeStorage.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* A faked local or session storage used when the user has disabled storage
|
||||||
|
*/
|
||||||
|
class FakeStorage {
|
||||||
|
data = {};
|
||||||
|
key(index) {
|
||||||
|
return Object.keys(this.data)[index] || null;
|
||||||
|
}
|
||||||
|
getItem(keyName) {
|
||||||
|
return this.data[keyName] || null;
|
||||||
|
}
|
||||||
|
setItem(keyName, keyValue) {
|
||||||
|
this.data[keyName] = keyValue;
|
||||||
|
}
|
||||||
|
removeItem(keyName) {
|
||||||
|
delete this.data[keyName];
|
||||||
|
}
|
||||||
|
clear() {
|
||||||
|
this.data = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FakeStorage;
|
@ -1,12 +1,24 @@
|
|||||||
|
import FakeStorage from "./FakeStorage";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An interface to a local storage back settings store with a versioning mechanism
|
* An interface to a local storage back settings store with a versioning mechanism
|
||||||
*/
|
*/
|
||||||
class Settings {
|
class Settings {
|
||||||
name;
|
name;
|
||||||
currentVersion;
|
currentVersion;
|
||||||
|
storage;
|
||||||
|
|
||||||
constructor(name) {
|
constructor(name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
// Try and use local storage if it is available, if not mock it with an in memory storage
|
||||||
|
try {
|
||||||
|
localStorage.setItem("__test", "__test");
|
||||||
|
localStorage.removeItem("__test");
|
||||||
|
this.storage = localStorage;
|
||||||
|
} catch (e) {
|
||||||
|
console.warn("Local storage is disabled, no settings will be saved");
|
||||||
|
this.storage = new FakeStorage();
|
||||||
|
}
|
||||||
this.currentVersion = this.get("__version");
|
this.currentVersion = this.get("__version");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -18,7 +30,7 @@ class Settings {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getAll() {
|
getAll() {
|
||||||
return JSON.parse(localStorage.getItem(this.name));
|
return JSON.parse(this.storage.getItem(this.name));
|
||||||
}
|
}
|
||||||
|
|
||||||
get(key) {
|
get(key) {
|
||||||
@ -27,7 +39,7 @@ class Settings {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setAll(newSettings) {
|
setAll(newSettings) {
|
||||||
localStorage.setItem(
|
this.storage.setItem(
|
||||||
this.name,
|
this.name,
|
||||||
JSON.stringify({ ...newSettings, __version: this.currentVersion })
|
JSON.stringify({ ...newSettings, __version: this.currentVersion })
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user