Files
grungnet/src/contexts/DatabaseContext.js

51 lines
1.5 KiB
JavaScript
Raw Normal View History

import React, { useState, useEffect } from "react";
import { getDatabase } from "../database";
const DatabaseContext = React.createContext();
export function DatabaseProvider({ children }) {
const [database, setDatabase] = useState();
const [databaseStatus, setDatabaseStatus] = useState("loading");
useEffect(() => {
// Create a test database and open it to see if indexedDB is enabled
let testDBRequest = window.indexedDB.open("__test");
2020-10-23 22:16:18 +11:00
testDBRequest.onsuccess = async function () {
testDBRequest.result.close();
2020-10-23 22:16:18 +11:00
let db = getDatabase({ autoOpen: false });
setDatabase(db);
2020-10-23 22:16:18 +11:00
db.on("ready", () => {
setDatabaseStatus("loaded");
});
await db.open();
window.indexedDB.deleteDatabase("__test");
};
// If indexedb disabled create an in memory database
testDBRequest.onerror = async function () {
console.warn("Database is disabled, no state will be saved");
const indexedDB = await import("fake-indexeddb");
const IDBKeyRange = await import("fake-indexeddb/lib/FDBKeyRange");
2020-10-23 22:16:18 +11:00
let db = getDatabase({ indexedDB, IDBKeyRange, autoOpen: false });
setDatabase(db);
2020-10-23 22:16:18 +11:00
db.on("ready", () => {
setDatabaseStatus("disabled");
});
await db.open();
window.indexedDB.deleteDatabase("__test");
};
}, []);
const value = {
database,
databaseStatus,
};
return (
<DatabaseContext.Provider value={value}>
{children}
</DatabaseContext.Provider>
);
}
export default DatabaseContext;